我有两个表,两个表都包含一个称为帐户代码的标识符,但是第一个表可以包含该帐户代码的多次出现,而另一个表只有一次出现。我的表格最初来自excel,因此将它们放入pandas数据框后看起来像这样
基本数据
+-------+----------------+----------+
| Name | Account Number | $ Amount |
+-------+----------------+----------+
| Brett | 1234 | a |
| Brett | 1234 | b |
| Jill | 2458 | c |
| Peter | 1485 | d |
+-------+----------------+----------+
licensee_fee
+----------------+--------------+
| Account Number | Licensee Fee |
+----------------+--------------+
| 1234 | x |
| 1485 | y |
+----------------+--------------+
所以当我这样做
base_data = pd.read_excel(filename, sheet_name=0, dytpe={"Account Number": "str"})
licensee_fee = pd.read_excel(filename, sheet_name=1, dtype={"Account Number": "str"})
# the first 2 columns contain irrelevant data
result = pd.merge(base_date, licensee_fee.iloc[:,[2,3]], how="outer", on="Account Number")
如我所料
+-------+----------------+----------+--------------+
| Name | Account Number | $ Amount | Licensee Fee |
+-------+----------------+----------+--------------+
| Brett | 1234 | a | x |
| Brett | 1234 | b | x |
| Jill | 2458 | c | - |
| Peter | 1485 | d | y |
+-------+----------------+----------+--------------+
但这在我需要的方面是不正确的。 我真正想要的是看起来像这样
+-------+----------------+----------+--------------+
| Name | Account Number | $ Amount | Licensee Fee |
+-------+----------------+----------+--------------+
| Brett | 1234 | a | x |
| Brett | 1234 | b | - |
| Jill | 2458 | c | - |
| Peter | 1485 | d | y |
+-------+----------------+----------+--------------+
被许可人的费用只发生一次。
我有一些代码可以处理NULL值,所以这不是问题。
答案 0 :(得分:3)
这是一个好问题,您可能需要先使用cumcount
创建merge
帮助键,这将确保一旦使用了费用项目,便不会再次使用它。
base['helpkey']=base.groupby('AccountNumber').cumcount()
fee['helpkey']=fee.groupby('AccountNumber').cumcount()
yourdf=base.merge(fee,on=['AccountNumber','helpkey'],how='left').drop('helpkey',1)
yourdf
Name AccountNumber $Amount LicenseeFee
0 Brett 1234 a x
1 Brett 1234 b NaN
2 Jill 2458 c NaN
3 Peter 1485 d y
答案 1 :(得分:1)
您可以先合并,然后再处理NaN:
In [11]: res = df.merge(df1, how='outer')
In [12]: res
Out[12]:
Name Account Number $Amount Licensee Fee
0 Brett 1234 a x
1 Brett 1234 b x
2 Jill 2458 c NaN
3 Peter 1485 d y
In [13]: res.loc[res.groupby("Account Number").cumcount() > 0, "Licensee Fee"] = np.nan
In [14]: res
Out[14]:
Name Account Number $Amount Licensee Fee
0 Brett 1234 a x
1 Brett 1234 b NaN
2 Jill 2458 c NaN
3 Peter 1485 d y