繁体   English   中英

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

[英]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.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)

使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM