如何处理熊猫中重复的“唯一标识符”

时间:2019-02-15 00:30:45

标签: python pandas

我有两个表,两个表都包含一个称为帐户代码的标识符,但是第一个表可以包含该帐户代码的多次出现,而另一个表只有一次出现。我的表格最初来自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值,所以这不是问题。

2 个答案:

答案 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