繁体   English   中英

Pandas 合并两个数据框并删除额外的行

[英]Pandas merge two dataframe and drop extra rows

如何仅在“sample_id”上合并/加入这两个数据帧,并在合并/加入时从第二个数据帧中删除额外的行?

在 Python 中使用熊猫

第一个数据框 (fdf)

| sample_id | name  |
|-----------|-------|
| 1         | Mark  |
| 1         | Dart  |
| 2         | Julia |
| 2         | Oolia |
| 2         | Talia |

第二个数据框 (sdf)

| sample_id | salary | time |
|-----------|--------|------|
| 1         | 20     | 0    |
| 1         | 30     | 5    |
| 1         | 40     | 10   |
| 1         | 50     | 15   |
| 2         | 33     | 0    |
| 2         | 23     | 5    |
| 2         | 24     | 10   |
| 2         | 28     | 15   |
| 2         | 29     | 20   |

所以产生的 df 会像 -

| sample_id | name  | salary | time |
|-----------|-------|--------|------|
| 1         | Mark  | 20     | 0    |
| 1         | Dart  | 30     | 5    |
| 2         | Julia | 33     | 0    |
| 2         | Oolia | 23     | 5    |
| 2         | Talia | 24     | 10   |

有重复,所以需要帮助列正确的DataFrame.mergeGroupBy.cumcount作为计数器:

df = (fdf.assign(g=fdf.groupby('sample_id').cumcount())
        .merge(sdf.assign(g=sdf.groupby('sample_id').cumcount()), on=['sample_id', 'g'])
        .drop('g', axis=1))
print (df)
   sample_id   name  salary  time
0          1   Mark      20     0
1          1   Dart      30     5
2          2  Julia      33     0
3          2  Oolia      23     5
4          2  Talia      24    10
final_res = pd.merge(df,df2,on=['sample_id'],how='left')
final_res.sort_values(['sample_id','name','time'],ascending=[True,True,True],inplace=True)

final_res.drop_duplicates(subset=['sample_id','name'],keep='first',inplace=True)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM