python-列的总和列表,即使不是所有列

python-列的总和列表,即使不是所有列,python,pandas,numpy,Python,Pandas,Numpy,我有一个像这样的数据框 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  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\u cols=list('ACE')
,然后与您使用的任何数据帧相交

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