bre*_*ezz 3 python dataframe pandas pandas-groupby
给定这样的数据框,即使在一行中有多个国家/地区,是否也可以将国家/地区的特定值相加?例如,对于第一行日本和美国存在,所以我希望值为 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)
Run Code Online (Sandbox Code Playgroud)
我试过这个,但它返回一个石斑鱼和轴必须是相同的长度错误。这是正确的方法吗?
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:
Run Code Online (Sandbox Code Playgroud)
因此,我希望最终结果是日本:8 欧洲:6 美国:3
谢谢
您能否尝试使用所示示例进行以下,编写和测试。使用split, explode, groupbyPandas 的函数。
df['Country'] = df['Country'].str.split(';')
df.explode('Country').groupby('Country')['Employees'].sum()
Run Code Online (Sandbox Code Playgroud)
输出如下:
Country
Eurpoe 6
Japan 8
USA 3
Name: Employees, dtype: int64
Run Code Online (Sandbox Code Playgroud)
解释:简单的解释是:
;结果保存到同一列中。explode在 Country 列上使用groupby,然后在 Country 列上使用并sum在其上使用函数以获取其在 Employees 列中的总和。| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |