组合DataFrame中的多个列

时间:2015-09-22 17:00:22

标签: python pandas dataframe

我有一个包含40列(第0列到第39列)的DataFrame,我想一次将它们分组四个:

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中的列名称并不重要。

4 个答案:

答案 0 :(得分:2)

你可以在行轴上选择列和总和,就像这样。

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

有几点需要注意:

  1. 这样求和会在df[0] + df[1] ...传播时忽略丢失的数据。如果您想要这种行为,请通过skipna=False
  2. 不一定是任何性能优势,实际上可能会慢一点。

答案 1 :(得分:2)

这是另一种方法:

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

请注意,这里的除法运算是integer division,而不是浮点除法。

答案 2 :(得分:1)

我不知道这是否是最好的方式,但我最终使用MultiIndex:

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对我来说更快。

答案 3 :(得分: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)]