合并两个具有不同结构的Dataframes
Merge two Dataframes with different structures
我正在尝试将两个数据帧相互组合。但是我坚持逻辑(也许我对这个问题看得太久了)。
问题:
DF1 的格式如下:
Country ID March April May June
Netherlands A 10 20 15 14
Netherlands B 15 18 10 4
Germany C 9 8 3 1
然后,我有另一个数据框:
DF2
Country ID Month Number
Netherlands A March 8
Netherlands A March 28
Netherlands B April 18
Germany C Jan 9
我想合并这两列(格式与 DF1 相同)。
我的假设是应该类似于按(国家/地区 + ID)分组,然后(月份作为列,然后对数字求和)。 - 但如前所述,我很困惑。
期望的输出:
Country ID March April May June df2_Jan df2_March df2_April
Netherlands A 10 20 15 14 0 36 #8+28 0
Netherlands B 15 18 10 4 0 0 18
Germany C 9 8 3 1 9 0 0
希望你能帮助我。非常感谢!
你可以试试:
merged_df = (
df1.merge(
df2.pivot_table(
index=['Country', 'ID'],
columns='Month',
values='Number',
aggfunc=sum,
fill_value=0)
.add_prefix('df2_')
.reset_index(),
on=['Country', 'ID']
)
)
输出:
Country ID March April May June df2_April df2_Jan df2_March
0 Netherlands A 10 20 15 14 0 0 36
1 Netherlands B 15 18 10 4 18 0 0
2 Germany C 9 8 3 1 0 9 0
在DF2中求和确实是一个简单的groupby().sum()
操作
df2 = df2.groupby(['Country', 'ID', 'Month'])['Number'].sum()
您现在有一个具有 3 级索引的系列。
似乎要使 DF2 的格式与 DF1 相同,您只需要一个 .unstack()
将其中一个索引级别转换为列。
df2 = df2.unstack('Month', fill_value=0)
以相同格式合并现在很容易
df1.merge(df2.add_prefix('df2_').reset_index(), on=['Country', 'ID'])
根据@Nk03 的回答,第 1 步和第 2 步可以替换为使用 aggfunc
参数调用 .pivot_table
。
我正在尝试将两个数据帧相互组合。但是我坚持逻辑(也许我对这个问题看得太久了)。
问题: DF1 的格式如下:
Country ID March April May June
Netherlands A 10 20 15 14
Netherlands B 15 18 10 4
Germany C 9 8 3 1
然后,我有另一个数据框:
DF2
Country ID Month Number
Netherlands A March 8
Netherlands A March 28
Netherlands B April 18
Germany C Jan 9
我想合并这两列(格式与 DF1 相同)。 我的假设是应该类似于按(国家/地区 + ID)分组,然后(月份作为列,然后对数字求和)。 - 但如前所述,我很困惑。
期望的输出:
Country ID March April May June df2_Jan df2_March df2_April
Netherlands A 10 20 15 14 0 36 #8+28 0
Netherlands B 15 18 10 4 0 0 18
Germany C 9 8 3 1 9 0 0
希望你能帮助我。非常感谢!
你可以试试:
merged_df = (
df1.merge(
df2.pivot_table(
index=['Country', 'ID'],
columns='Month',
values='Number',
aggfunc=sum,
fill_value=0)
.add_prefix('df2_')
.reset_index(),
on=['Country', 'ID']
)
)
输出:
Country ID March April May June df2_April df2_Jan df2_March
0 Netherlands A 10 20 15 14 0 0 36
1 Netherlands B 15 18 10 4 18 0 0
2 Germany C 9 8 3 1 0 9 0
在DF2中求和确实是一个简单的
groupby().sum()
操作df2 = df2.groupby(['Country', 'ID', 'Month'])['Number'].sum()
您现在有一个具有 3 级索引的系列。
似乎要使 DF2 的格式与 DF1 相同,您只需要一个
.unstack()
将其中一个索引级别转换为列。df2 = df2.unstack('Month', fill_value=0)
以相同格式合并现在很容易
df1.merge(df2.add_prefix('df2_').reset_index(), on=['Country', 'ID'])
根据@Nk03 的回答,第 1 步和第 2 步可以替换为使用 aggfunc
参数调用 .pivot_table
。