python pandas。基于字符串列在另一列的逗号分隔值中的匹配的列总和
python pandas. Sum of a column based on a match of string column in a comma separated values of another column
我有 2 个数据框样本,名称已更改:
df1
=
Comp_code
DepartmentListA
DepartmentListB
Code_1
"Dept1"
"Dept3"
Code_2
"Dept2"
"Dept4"
Code_3
"Dept4, Dept5"
"Dept1"
Code_4
"Dept1,Dept5, Dept6"
"Dept3, Dept4"
df2
= 只有部门和收入
DepartmentList
Revenue
Gross Margin
"Dept1"
1000
500
"Dept2"
2000
0
"Dept3,
5000
900
"Dept4"
5000
200
"Dept5"
7000
-100
"Dept6"
8000
2500
我希望我的最终 df 包含公司代码以及总收入和毛利率。汇总 A 列和 B 列中的部门总数。
由于以逗号分隔的部门字符串,我无法迭代和加入。我最后的DF应该是这样的
预期 df =
Comp_code
GrossRev
Tot Margin
Code_1
6000
1400
Code_2
7000
200
Code_3
13000
600
Code_4
26000
4000
数据框也有几百万行,一些部门列表(逗号分隔值)大约有 100 个。如果有一种高效的方法来做到这一点,那就太好了。
此代码有效。很长,但大部分都是重复的。
new_df = df1[['Comp_code']].copy()
new_df['GrossRev'] = df1['DepartmentListB'].str.split(',').explode().map(df2.set_index('DepartmentList')['Revenue']).groupby(level=0).sum() + df1['DepartmentListA'].str.split(',').explode().map(df2.set_index('DepartmentList')['Revenue']).groupby(level=0).sum()
new_df['Tot Margin'] = df1['DepartmentListB'].str.split(',').explode().map(df2.set_index('DepartmentList')['GrossMargin']).groupby(level=0).sum() + df1['DepartmentListA'].str.split(',').explode().map(df2.set_index('DepartmentList')['GrossMargin']).groupby(level=0).sum()
输出:
>>> new_df
Comp_code GrossRev Tot Margin
0 Code_1 6000 1400
1 Code_2 7000 200
2 Code_3 13000 600
3 Code_4 26000 4000
我有 2 个数据框样本,名称已更改:
df1
=
Comp_code | DepartmentListA | DepartmentListB |
---|---|---|
Code_1 | "Dept1" | "Dept3" |
Code_2 | "Dept2" | "Dept4" |
Code_3 | "Dept4, Dept5" | "Dept1" |
Code_4 | "Dept1,Dept5, Dept6" | "Dept3, Dept4" |
df2
= 只有部门和收入
DepartmentList | Revenue | Gross Margin |
---|---|---|
"Dept1" | 1000 | 500 |
"Dept2" | 2000 | 0 |
"Dept3, | 5000 | 900 |
"Dept4" | 5000 | 200 |
"Dept5" | 7000 | -100 |
"Dept6" | 8000 | 2500 |
我希望我的最终 df 包含公司代码以及总收入和毛利率。汇总 A 列和 B 列中的部门总数。 由于以逗号分隔的部门字符串,我无法迭代和加入。我最后的DF应该是这样的
预期 df =
Comp_code | GrossRev | Tot Margin |
---|---|---|
Code_1 | 6000 | 1400 |
Code_2 | 7000 | 200 |
Code_3 | 13000 | 600 |
Code_4 | 26000 | 4000 |
数据框也有几百万行,一些部门列表(逗号分隔值)大约有 100 个。如果有一种高效的方法来做到这一点,那就太好了。
此代码有效。很长,但大部分都是重复的。
new_df = df1[['Comp_code']].copy()
new_df['GrossRev'] = df1['DepartmentListB'].str.split(',').explode().map(df2.set_index('DepartmentList')['Revenue']).groupby(level=0).sum() + df1['DepartmentListA'].str.split(',').explode().map(df2.set_index('DepartmentList')['Revenue']).groupby(level=0).sum()
new_df['Tot Margin'] = df1['DepartmentListB'].str.split(',').explode().map(df2.set_index('DepartmentList')['GrossMargin']).groupby(level=0).sum() + df1['DepartmentListA'].str.split(',').explode().map(df2.set_index('DepartmentList')['GrossMargin']).groupby(level=0).sum()
输出:
>>> new_df
Comp_code GrossRev Tot Margin
0 Code_1 6000 1400
1 Code_2 7000 200
2 Code_3 13000 600
3 Code_4 26000 4000