【问题标题】:Python: group by with sum special columns and keep the initial rows tooPython:使用 sum 特殊列分组并保留初始行
【发布时间】:2019-11-29 19:17:45
【问题描述】:

我有一个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 值,方法是将 row#2 & row#3 & row#4 (Golf, Tiguan, Touareg) 中的值添加到 Car 列中)并将 row#2 & row#3 & row#4 的值保持为初始值。 因为Passat 包含Golf, Touareg, Tiguan,因此我需要将Golf, Touareg, Tiguanrows 的值添​​加到Passat 行。

我尝试使用以下代码: car_list = ['Golf', 'Tiguan', 'Touareg']

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

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

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   

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

【问题讨论】:

    标签: pandas group-by sum apply concat


    【解决方案1】:

    首先我们使用.isin 来获取正确的Cars,然后我们使用.filter 来获取正确的值列,最后我们使用sum 将值放入我们的变量sums

    然后我们选择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 的列表更改为car_list = ['Porsche'] 并使用sums = df[df['Car'].isin(car_list)].filter(regex='\w{3}\d{2}').sum()df.loc[df['Car'].eq('Mercedes'), 'Jan17':] += sums 时,出现了一个问题。结果我收到NaN 的行中Mercedes。我不明白为什么会这样。
    • 我刚试了一下,效果很好。尝试重新启动内核,或再次加载数据集,以便重新启动代码。 @辛迪
    • 我不知道为什么,但 sums = df[df['Car'].isin(car_list)].filter(regex='\w{3}\d{2}').sum() 返回空 pd.series。由于它,我试图以更长的方式做到这一点。无论如何,非常感谢简短的解决方案。
    【解决方案2】:

    从功能上看解决方法:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-14
      • 2021-01-26
      • 2023-04-04
      • 2021-05-21
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多