>> df = pd.DataFrame(np.random.rand(10,4))
>> pd.cut(df,[0,0.5,1])
ValueError: Input array must be 1 dimensional
如何使pd.cut()
跨数据框架的所有列工作?
答案 0 :(得分:5)
使用apply
df.apply(pd.cut, bins=[0,0.5,1])
如果要跨列(axis
)或行(axis=0
)运行,可以指定axis=1
答案 1 :(得分:5)
如果您不介意标签的类型略有不同,则numpy.digitize
提供矢量化的n-d
解决方案。
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)
答案 2 :(得分:4)
使用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)
答案 3 :(得分:3)
您可以堆叠和卸载:
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
,他们会给出不同的答案。 (哪种方法更好取决于您的情况。)