[英]how to use pd.cut() across columns of a data frame?
>> df = pd.DataFrame(np.random.rand(10,4))
>> pd.cut(df,[0,0.5,1])
ValueError: Input array must be 1 dimensional
如何让pd.cut()
在数据框的所有列上工作?
使用apply
df.apply(pd.cut, bins=[0,0.5,1])
如果要跨列( axis=0
)或行( axis=1
)运行,可以指定axis
如果你不介意稍微不同类型的标签, numpy.digitize
提供了一个量化的nd
方案。
np.digitize(df, bins=[0, 0.5, 1.0])
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)
标签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)
使用pd.cut
只接受一个维度
df = pd.DataFrame(np.random.rand(10,4))
pd.cut(df[0],[0,0.5,1])
要么
df.apply(lambda x : pd.cut(x,[0,0.5,1]),1)
你可以堆叠和取消堆栈:
pd.cut(df.stack(),[0,0.5,1]).unstack()
结果:
0 1 2 3
0 (0.5, 1.0] (0.0, 0.5] (0.5, 1.0] (0.5, 1.0]
1 (0.0, 0.5] (0.0, 0.5] (0.5, 1.0] (0.0, 0.5]
2 (0.5, 1.0] (0.5, 1.0] (0.5, 1.0] (0.5, 1.0]
对于cut
,这种方式应该等同于逐列应用cut
的其他答案。 但如果你使用qcut
,他们会给出不同的答案。 (哪种方式更可取决于你的情况。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.