>> df = pd.DataFrame(np.random.rand(10,4))
>> pd.cut(df,[0,0.5,1])
ValueError: Input array must be 1 dimensional
Run Code Online (Sandbox Code Playgroud)
如何pd.cut()跨数据框架的所有列工作?
用做它pd.cut只能接受一个维
df = pd.DataFrame(np.random.rand(10,4))
pd.cut(df[0],[0,0.5,1])
Run Code Online (Sandbox Code Playgroud)
或者
df.apply(lambda x : pd.cut(x,[0,0.5,1]),1)
Run Code Online (Sandbox Code Playgroud)
使用 apply
df.apply(pd.cut, bins=[0,0.5,1])
Run Code Online (Sandbox Code Playgroud)
您可以指定axis是否要跨列(axis=0)或行(axis=1)运行
如果您不介意标签的类型略有不同,请numpy.digitize提供矢量化n-d解决方案。
np.digitize(df, bins=[0, 0.5, 1.0])
Run Code Online (Sandbox Code Playgroud)
array([[2, 2, 2, 2],
[1, 2, 2, 2],
[1, 1, 2, 1],
[2, 1, 2, 1],
[2, 1, 2, 1],
[2, 2, 2, 2],
[1, 2, 1, 1],
[2, 1, 2, 2],
[2, 2, 1, 1],
[2, 1, 2, 1]], dtype=int64)
Run Code Online (Sandbox Code Playgroud)
标签1将对应于0-0.5,2以0.5-1.0,等等。
性能
df = pd.DataFrame(np.random.rand(1000, 1000))
%timeit pd.DataFrame(np.digitize(df, bins=[0, 0.5, 1.0]), columns=df.columns)
13.2 ms ± 36.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit df.apply(pd.cut, bins=[0, 0.5, 1])
3.11 s ± 12.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit pd.cut(df.stack(),[0,0.5,1]).unstack()
1.48 s ± 3.82 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |