【问题标题】:Pandas merge two dataframe and drop extra rows熊猫合并两个数据框并删除额外的行
【发布时间】:2019-07-19 15:56:07
【问题描述】:

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

在 Python 中使用 pandas

第一个数据帧 (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   |

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    有重复项,因此需要帮助列正确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
    

    【讨论】:

      【解决方案2】:
      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)
      

      【讨论】:

        猜你喜欢
        • 2017-06-11
        • 2016-01-01
        • 2017-12-09
        • 2017-09-02
        • 2020-06-11
        相关资源
        最近更新 更多