2016-02-16 60 views
2

是否可以使用循環對數據框的所有列進行百分比切割?這是我怎麼做,現在:蟒蛇 - 可能適用百分比削減數據框中的每一列?

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

我希望有這種避免使用循環的一個圓滑的大熊貓的解決方案。

謝謝!

回答

3

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。

+0

夠公平的,謝謝你。 – MJS

+0

你會怎麼稱它爲行? –

+0

@ thomas.mac:將'axis = 0'更改爲'axis = 1'以將函數應用於行。 – unutbu