【问题标题】:Pandas comparing dataframes and changing column value based on number of similar rows in another dataframePandas 比较数据帧并根据另一个数据帧中的相似行数更改列值
【发布时间】:2020-11-05 10:26:08
【问题描述】:

假设我有两个数据框:

df1:

    Person Number Type
0   Kyle   12     Male
1   Jacob  15     Male
2   Jacob  15     Male

df2: 一个更大的数据集,格式相似,只是有一个计数列需要根据 df1 递增

    Person Number Type    Count 
0   Kyle   12     Male    0
1   Jacob  15     Male    0
3   Sally  43     Female  0
4   Mary   15     Female  5

我要做的是根据 df1 中同一个人的出现次数增加计数列

此示例的异常输出:

    Person Number  Type    Count 
0   Kyle   12     Male    1
1   Jacob  15     Male    2
3   Sally  43     Female  0
4   Mary   15     Female  5

将 Kyle 的计数增加到 1,因为有一个实例,将计数增加到 2,因为 Jacob 的实例有两个。不要更改 Sally 和 Mary 的值并保持值不变。

我该怎么做?我试过使用 .loc 但我不知道如何解释同一行的两个实例。这意味着即使 df1 中有两个 Jacobs,我也只能让 Jacob 的 count 增加一。

我试过了

df2.loc[df2['Person'].values == df1['Person'].values, 'Count'] += 1

但这不考虑重复。

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    value_counts + 索引对齐。

    u = df2.set_index("Person")
    u.assign(Count=df1["Person"].value_counts().add(u["Count"], fill_value=0))
    

            Number    Type  Count
    Person
    Kyle        12    Male    1.0
    Jacob       15    Male    2.0
    Sally       43  Female    0.0
    Mary        15  Female    5.0
    

    【讨论】:

      【解决方案2】:
      df1 = df1.groupby(df.columns.tolist(), as_index=False).size().to_frame('Count').reset_index()
      
      df1 = df1.set_index(['Person','Number','Type'])
      df2 = df2.set_index(['Person','Number','Type'])
      
      df1.add(df2, fill_value=0).reset_index()
      

      或者

      df1 = df1.groupby(df.columns.tolist(), as_index=False).size().to_frame('Count').reset_index()
      df2.merge(df1, on=['Person','Number','Type'], how='left').set_index(['Person','Number','Type']).sum(axis=1).to_frame('Count').reset_index()
      

      【讨论】:

        猜你喜欢
        • 2017-08-16
        • 2018-10-30
        • 1970-01-01
        • 1970-01-01
        • 2019-07-10
        • 1970-01-01
        • 2017-04-25
        • 2019-06-23
        • 1970-01-01
        相关资源
        最近更新 更多