pandas - python 如何在数据框架的列中使用 pd.cut()?


>> 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 提供了一个矢量化的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)



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



你可以堆栈和 unstack:


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 他们会给你不同的答案。 ( 哪种方式更好取决于你的情况。)

...