python - 可以对数据框中的每一列应用百分位切割吗?
python - possible to apply percentile cuts to each column in a dataframe?
是否可以使用循环对数据框的所有列进行百分位切割?我现在就是这样做的:
df = pd.DataFrame(np.random.randn(10,5))
df_q = pd.DataFrame()
for i in list(range(len(df.columns))):
df_q[i] = pd.qcut(df[i], 5, labels=list(range(5)))
我希望有一个灵活的 pandas 解决方案来避免使用循环。
谢谢!
pd.qcut
接受一维数组或系列作为其参数。要将 pd.qcut
应用于每一列,需要多次调用 pd.qcut
。所以无论你怎么装扮,都会有一个循环——或显式或隐式。
例如,您可以使用 apply
为每一列调用 pd.qcut
:
In [46]: df.apply(lambda x: pd.qcut(x, 5, labels=list(range(5))), axis=0)
Out[46]:
0 1 2 3 4
0 4 0 3 0 3
1 0 0 2 3 0
2 3 4 1 2 3
3 4 1 1 1 4
4 3 2 2 4 1
5 2 4 3 0 1
6 2 3 0 4 4
7 1 3 4 2 2
8 0 1 4 3 0
9 1 2 0 1 2
但在幕后,df.apply
使用的是 for-loop
,因此它与您的 for-loop
:
并没有太大区别
df_q = pd.DataFrame()
for col in df:
df_q[col] = pd.qcut(df[col], 5, labels=list(range(5)))
In [47]: %timeit df.apply(lambda x: pd.qcut(x, 5, labels=list(range(5))), axis=0)
100 loops, best of 3: 2.9 ms per loop
In [48]: %%timeit
df_q = pd.DataFrame()
for col in df:
df_q[col] = pd.qcut(df[col], 5, labels=list(range(5)))
100 loops, best of 3: 2.95 ms per loop
请注意
for i in list(range(len(df.columns))):
仅当 df
的列恰好是从 0 开始的连续整数时才有效。
使用
更健壮
for col in df:
迭代 DataFrame 的列。
是否可以使用循环对数据框的所有列进行百分位切割?我现在就是这样做的:
df = pd.DataFrame(np.random.randn(10,5))
df_q = pd.DataFrame()
for i in list(range(len(df.columns))):
df_q[i] = pd.qcut(df[i], 5, labels=list(range(5)))
我希望有一个灵活的 pandas 解决方案来避免使用循环。
谢谢!
pd.qcut
接受一维数组或系列作为其参数。要将 pd.qcut
应用于每一列,需要多次调用 pd.qcut
。所以无论你怎么装扮,都会有一个循环——或显式或隐式。
例如,您可以使用 apply
为每一列调用 pd.qcut
:
In [46]: df.apply(lambda x: pd.qcut(x, 5, labels=list(range(5))), axis=0)
Out[46]:
0 1 2 3 4
0 4 0 3 0 3
1 0 0 2 3 0
2 3 4 1 2 3
3 4 1 1 1 4
4 3 2 2 4 1
5 2 4 3 0 1
6 2 3 0 4 4
7 1 3 4 2 2
8 0 1 4 3 0
9 1 2 0 1 2
但在幕后,df.apply
使用的是 for-loop
,因此它与您的 for-loop
:
df_q = pd.DataFrame()
for col in df:
df_q[col] = pd.qcut(df[col], 5, labels=list(range(5)))
In [47]: %timeit df.apply(lambda x: pd.qcut(x, 5, labels=list(range(5))), axis=0)
100 loops, best of 3: 2.9 ms per loop
In [48]: %%timeit
df_q = pd.DataFrame()
for col in df:
df_q[col] = pd.qcut(df[col], 5, labels=list(range(5)))
100 loops, best of 3: 2.95 ms per loop
请注意
for i in list(range(len(df.columns))):
仅当 df
的列恰好是从 0 开始的连续整数时才有效。
使用
for col in df:
迭代 DataFrame 的列。