我有两个数据集需要在熊猫中组合。一个包括一堆发票的信息,两张包括供应商信息。我在下面包括了一个简化的示例。
基本上,我想将供应商数据与供应商ID上的发票数据相结合,以便每个发票都从供应商信息数据中拥有供应商的本国。
我尝试以不同的方式(内部,左,外部)合并和加入,并且它并未根据我需要的重复供应商ID重复。我很难弄清楚如何重复观察。例如,A公司可能会出现在2张以上的发票中,因此我们需要国家/地区填充每个发票,但是合并它只会在一个填充中。其余的将是Nan。谁能帮忙?
数据示例:
d1 = {'company id': [11, 12, 11, 11, 13, 12, 14],
'company': ["Company A", "Company B", "Company A", "Company A", "Company C", "Company B", "Company D"],
'USD': [120000, 20000, 4000000, 99000, 8000, 110000, 443000], 'Invoice no': [1, 2, 3, 4, 5, 6, 7]}
invoices = pd.DataFrame(data=d1)
d2 = {'company id': [11, 12, 13, 14],
'company': ["Company A", "Company B", "Company C", "Company D"],
'Country': ["USA", "USA", "AUS", "MEX"]}
supplier = pd.DataFrame(data=d2)
使用pd.Series使用map
:
invoices['Country'] = invoices['company id'].map(supplier.set_index('company id')['Country'])
invoices
输出:
company id company USD Invoice no Country
0 11 Company A 120000 1 USA
1 12 Company B 20000 2 USA
2 11 Company A 4000000 3 USA
3 11 Company A 99000 4 USA
4 13 Company C 8000 5 AUS
5 12 Company B 110000 6 USA
6 14 Company D 443000 7 MEX
详细信息,首先创建一个系列,将公司ID映射到索引和国家/地区的公司ID作为PD的价值。然后,使用pd.series.map将发票数据框中的公司ID的每个值都提供给定义的pd.Series提供的国家。
不确定您从哪里获得NaN
,但合并对我有用。
merged = pd.merge(invoices, supplier, on=['company id', 'company'], how='left')
print(merged)
company id company USD Invoice no Country
0 11 Company A 120000 1 USA
1 12 Company B 20000 2 USA
2 11 Company A 4000000 3 USA
3 11 Company A 99000 4 USA
4 13 Company C 8000 5 AUS
5 12 Company B 110000 6 USA
6 14 Company D 443000 7 MEX