【问题标题】:Summing up multiple values in single row在单行中汇总多个值
【发布时间】:2021-05-05 06:01:42
【问题描述】:

给定这样的数据框,即使一行中有多个国家/地区,是否可以将国家/地区的特定值相加?例如,对于第一行,存在日本和美国,所以我希望值为 Japan=1 USA=1

import pandas as pd
import numpy as np

countries=["Europe","USA","Japan"]
data= {'Employees':[1,2,3,4],
    'Country':['Japan;USA','USA;Europe',"Japan","Europe;Japan"]}
df=pd.DataFrame(data)
print(df)

patt = '(' + '|'.join(countries) + ')'
grp = df.Country.str.extractall(pat=patt).values
new_df = df.groupby(grp).agg({'Employees': sum})
print(new_df)

我已经尝试过了,但它返回一个 grouper 和 axis must be same length 错误。这是正确的做法吗?

ValueError                                Traceback (most recent call last)
<ipython-input-81-53e8e9f0f301> in <module>()
     10 patt = '(' + '|'.join(countries) + ')'
     11 grp = df.Country.str.extractall(pat=patt).values
---> 12 new_df = df.groupby(grp).agg({'Employees': sum})
     13 print(new_df)

    4 frames
    /usr/local/lib/python3.7/dist-packages/pandas/core/groupby/grouper.py in _convert_grouper(axis, grouper)
        842     elif isinstance(grouper, (list, Series, Index, np.ndarray)):
        843         if len(grouper) != len(axis):
    --> 844             raise ValueError("Grouper and axis must be same length")
        845         return grouper
        846     else:

因此,我希望最终结果是 日本:8 欧洲:6 美国:3

谢谢

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

    您能否尝试使用所示示例进行以下、编写和测试。使用 Pandas 的splitexplodegroupby 函数。

    df['Country'] = df['Country'].str.split(';')
    df.explode('Country').groupby('Country')['Employees'].sum()
    

    输出如下:

    Country
    Eurpoe  6
    Japan   8
    USA     3
    Name: Employees, dtype: int64
    

    解释:简单的解释是:

    • 首先将DataFrame的Country列按;拆分,并将结果保存到同一列中。
    • 然后在 Country 列上使用 explode,然后在 Country 列上使用 groupby 并在其上使用 sum 函数以在Employees 列中获得总和。

    【讨论】:

      猜你喜欢
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      • 2022-01-16
      • 2012-01-30
      • 2021-09-27
      相关资源
      最近更新 更多