熊猫合并两个数据框并删除多余的行

时间:2019-07-19 07:45:45

标签: python pandas dataframe

如何仅在“ 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   |

2 个答案:

答案 0 :(得分:0)

有重复项,因此需要帮助器列来正确设置DataFrame.merge,计数器需要使用GroupBy.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

答案 1 :(得分:0)

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)