我有一个看起来像这样的数据框

   A  B  C  D  G
0  9  5  7  6  1
1  1  4  7  3  1
2  8  4  1  3  1


由此产生:

df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('ABCD'))
x=np.array([[1,2]])
df['G'] = np.repeat(x,5)


假设有时存在某个列“ E”,但有时它并不取决于数据的时间范围。

所以有时候我们有

   A  B  C  D  E  G
0  9  5  7  6  2  1
1  1  4  7  3  3  1
2  8  4  1  3  4  1


因此,无论哪种方式,我都想对A,C和E列以及groupby列G的行求和。所以当E列存在时,我只使用

df.groupby('G')['A', 'C', 'E'].sum()


但是当E不存在时(例如在第一个数据帧中),它将不起作用。

即使缺少一列,我该怎么做才能求和?

最佳答案

您可以将希望求和的列存储在列表sum_cols = list('ACE')中,然后与与此列表一起使用的任何DataFrame相交。

df.groupby('G')[df.columns.intersection(sum_cols)].sum()


演示版

>>> df = pd.DataFrame(np.random.randint(0, 10, (2, 5)),
                      columns=list('ABCDG'))

>>> df
   A  B  C  D  G
0  9  5  9  2  6
1  3  1  1  1  3

>>> sum_cols = list('ACE')

>>> df.groupby('G')[df.columns.intersection(sum_cols)].sum()
   A  C
G
3  3  1
6  9  9

>>> df['E'] = [100, 200]

>>> df.groupby('G')[df.columns.intersection(sum_cols)].sum()
   A  C    E
G
3  3  1  200
6  9  9  100

关于python - python-列总和,即使不是全部,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49891600/

10-12 23:46