2015-09-22 186 views
1

我有40列(列0至39),一個數據幀,我想他們四人組在一個時間:合併多個列的數據幀

import numpy as np 
import pandas as pd 
df = pd.DataFrame(np.random.binomial(1, 0.2, (100, 40))) 

new_df["0-3"] = df[0] + df[1] + df[2] + df[3] 
new_df["4-7"] = df[4] + df[5] + df[6] + df[7] 
... 
new_df["36-39"] = df[36] + df[37] + df[38] + df[39] 

我能做到這一點在一個單獨的陳述中(或者比單獨彙總它們更好的方式)?新DataFrame中的列名稱並不重要。

回答

0

我不知道這是否是最好的一段路要走,但我最終使用多指標:

df.columns = pd.MultiIndex.from_product((range(10), range(4))) 
new_df = df.groupby(level=0, axis=1).sum() 

更新:可能是因爲指數的,這是比其它更快。如果考慮構建索引的時間,可以更快地完成df.groupby(df.columns//4, axis=1).sum()。但是,索引更改是一次性操作,我更新了df並將總和數千次,因此使用MultiIndex對我來說速度更快。

2

您可以選擇出行和總和在行軸上,就像這樣。

df['0-3'] = df.loc[:, 0:3].sum(axis=1) 

幾件事情要注意:

  1. 總結這樣會忽略數據缺失而df[0] + df[1] ...傳播它。如果您想要這種行爲,請通過skipna=False
  2. 不一定有任何性能優勢,實際上可能會慢一點。
0

考慮一個列表理解:

df = # your data 
df_slices = [df.iloc[x:x+4] for x in range(10)] 

或者更一般

df_slices = [df.iloc[x:x+4] for x in range(len(df.columns)/4)] 
2

這裏的另一種方式來做到這一點:

new_df = df.transpose() 
new_df['Group'] = new_df.index/4 
new_df = new_df.groupby('Group').sum().transpose() 

注意,分頻操作這裏是integer division ,而不是浮點分割。