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

Hap*_*yPy 3 python pandas

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

ValueError: Input array must be 1 dimensional
Run Code Online (Sandbox Code Playgroud)

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

WeN*_*Ben 5

用做它pd.cut只能接受一个维

df = pd.DataFrame(np.random.rand(10,4))
pd.cut(df[0],[0,0.5,1])
Run Code Online (Sandbox Code Playgroud)

或者

df.apply(lambda x : pd.cut(x,[0,0.5,1]),1)
Run Code Online (Sandbox Code Playgroud)


raf*_*elc 5

使用 apply

df.apply(pd.cut, bins=[0,0.5,1])
Run Code Online (Sandbox Code Playgroud)

您可以指定axis是否要跨列(axis=0)或行(axis=1)运行


use*_*203 5

如果您不介意标签的类型略有不同,请numpy.digitize提供矢量化n-d解决方案。


np.digitize(df, bins=[0, 0.5, 1.0])
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

标签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)
Run Code Online (Sandbox Code Playgroud)