Python: group by with sum special columns 并保留初始行

Python: group by with sum special columns and keep the initial rows too

我有一个 df:

ID  Car       Jan17     Jun18  Dec18  Apr19                            
0   Nissan     0.0       1.7    3.7    0.0       
1   Porsche    10.0      0.0    2.8    3.5       
2   Golf       0.0       1.7    3.0    2.0   
3   Tiguan     1.0       0.0    3.0    5.2         
4   Touareg    0.0       0.0    3.0    4.2    
5   Mercedes   0.0       0.0    0.0    7.2    
6   Passat     0.0       3.0    0.0    0.0   

我想更改第 6 行的值:Car 列中的 Passat 值,方法是添加第 2 行、第 3 行和第 4 行的值 (Golf, Tiguan, Touareg)Car 列中)并且还保留 row#2 & row#3 & row#4 的值作为初始值。 因为 Passat 包含 Golf, Touareg, Tiguan,因此我需要将 Golf, Touareg, Tiguan 行的值添加到 Passat 行。

我试着用下面的代码来做: car_list = ['Golf', 'Tiguan', 'Touareg']

for car in car_list:
  df['Car'][df['Car']==car]='Passat'

在我通过 Carsum() 函数使用 groupby 之后:

df1 = df.groupby(['Car'])['Jan17', 'Jun18', 'Dec18', 'Apr19'].sum().reset_index()

结果,df1 没有初始的 (Golf, Tiguan, Touareg) 行。所以,这种方式是错误的。

预期结果是df1

ID  Car       Jan17     Jun18  Dec18  Apr19                            
0   Nissan     0.0       1.7    3.7    0.0       
1   Porsche    10.0      0.0    2.8    3.5       
2   Golf       0.0       1.7    3.0    2.0   
3   Tiguan     1.0       0.0    3.0    5.2         
4   Touareg    0.0       0.0    3.0    4.2    
5   Mercedes   0.0       0.0    0.0    7.2       
6   Passat     1.0       4.7    9.0    11.4   

如有任何想法,我将不胜感激。谢谢)

首先我们使用 .isin 得到正确的 Cars,然后我们使用 .filter 得到正确的值列,最后我们 sum 值并把它​​们在我们的变量 sums.

然后我们 select Passat 行并将值添加到该行:

sums = df[df['Car'].isin(car_list)].filter(regex='\w{3}\d{2}').sum()

df.loc[df['Car'].eq('Passat'), 'Jan17':] += sums

输出

   ID       Car  Jan17  Jun18  Dec18  Apr19
0   0    Nissan    0.0    1.7    3.7    0.0
1   1   Porsche   10.0    0.0    2.8    3.5
2   2      Golf    0.0    1.7    3.0    2.0
3   3    Tiguan    1.0    0.0    3.0    5.2
4   4   Touareg    0.0    0.0    3.0    4.2
5   5  Mercedes    0.0    0.0    0.0    7.2
6   6    Passat    1.0    4.7    9.0   11.4

解决方案是针对功能:

car_list = ['Golf', 'Tiguan', 'Touareg', 'Passat']

 def updateCarInfoBySum(df, car_list, name, id):
      req = df[df['Car'].isin(car_list)]
      req.set_index(['Car', 'ID], inplace=True)
      req.loc[('new_value', '000'), :] = req.sum(axis=0)
      req.reset_index(inplace=True)
      req = req[req.Car != name]
      req['Car'][req['Car'] == 'new_value'] = name
      req['ID'][req['ID'] == '000'] = id
      req.set_index(['Car', 'ID], inplace=True)
      df_final = df.copy()
      df_final.set_index(['Car', 'ID], inplace=True)
      df_final.update(req)
      return df_final