我有 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。如果有一種高效的方式來做到這一點,那就太好了。
TIA,
uj5u.com熱心網友回復:
您可以通過以下方式做到這一點
df["all"] = ((df["DepartmentListA"]
", "
df["DepartmentListB"]).str.split("[\\s,] "))
df3 = df.explode("all")
df3 = (pd.merge(df3, df2, left_on='all',
right_on='Comp_code', suffixes=('', '_y'))
.groupby("Comp_code")
.agg({'Revenue': ['sum'], 'Gross Margin': 'sum'}).reset_index())
df3.columns = df3.columns.droplevel(-1)
print(df3)
Comp_code Revenue Gross Margin
0 Code_1 6000 1400
1 Code_2 7000 200
2 Code_3 13000 600
3 Code_4 26000 4000
uj5u.com熱心網友回復:
您可以melt explode獲取每個部門的單獨行,然后merge使用df2獲取資料,最后groupby sum聚合sum:
(df1.melt(id_vars='Comp_code')
.assign(value=lambda d: d['value'].str.split(r',\s*'))
.explode('value')
.merge(df2, left_on='value', right_on='DepartmentList')
.groupby('Comp_code').agg({'Revenue': 'sum', 'Gross Margin': 'sum'})
)
輸出:
Revenue Gross Margin
Comp_code
Code_1 6000 1400
Code_2 7000 200
Code_3 13000 600
Code_4 26000 4000
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/428063.html
