如何跨数据帧的列使用pd.cut()?

时间:2019-04-29 17:15:49

标签: python pandas

>> df = pd.DataFrame(np.random.rand(10,4))
>> pd.cut(df,[0,0.5,1])

ValueError: Input array must be 1 dimensional

如何使pd.cut()跨数据框架的所有列工作?

4 个答案:

答案 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.520.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,他们会给出不同的答案。 (哪种方法更好取决于您的情况。)