【问题标题】:Pandas get column value of first occurrence of condition per groupPandas 获取每组条件第一次出现的列值
【发布时间】:2018-03-19 08:34:15
【问题描述】:

我有一个熊猫数据框如下:

player  condition   num
A       0           1
A       1           2
A       1           3
B       0           1
B       0           2
B       1           3
B       0           4

我想添加一列来存储num 列的最小值,其中per player condition 列是1。

因此,结果应该如下所示:

player  condition   num  numCondition
A       0           1    2
A       1           2    2
A       1           3    2
B       0           1    3
B       0           2    3
B       1           3    3
B       0           4    3

我知道每个player 都需要groupBy()。然后我需要一个apply() 可能使用lambda() 函数。但我还不能把这些碎片拼在一起。

编辑:condition 列在我的示例中是一个简化。实际上,应该可以简单地使用通常的 pandas 数据框查询来过滤行。例如。 df[(df.condition == 1) & (df.otherCondition > 10)]

【问题讨论】:

    标签: python pandas lambda group-by apply


    【解决方案1】:

    通过使用drop_duplicates

    df.player.map(df[df.condition==1].drop_duplicates(['player'],keep='first').set_index('player').num)
        Out[221]: 
        0    2
        1    2
        2    2
        3    3
        4    3
        5    3
        6    3
        Name: player, dtype: int64
    
    df['numCondition']=df.player.map(df[df.condition==1].drop_duplicates(['player'],keep='first').set_index('player').num)
    df
    Out[223]: 
      player  condition  num  numCondition
    0      A          0    1             2
    1      A          1    2             2
    2      A          1    3             2
    3      B          0    1             3
    4      B          0    2             3
    5      B          1    3             3
    6      B          0    4             3
    

    【讨论】:

    • 谢谢!如果一组条件从未满足,会发生什么?也就是说,一组中永远不会有值 1?
    • @beta 将 NaN 替换 NaN ,可以通过 replace 或 fillna 完成
    【解决方案2】:

    先聚合,然后在player 上与df 重新加入:

    df.join(
        df.groupby('player')
          .apply(lambda g: g.num[g.condition == 1].min())
          .rename('numCondition'), 
    on='player')
    
    # player  condition   num   numCondition
    #0     A          0     1   2
    #1     A          1     2   2
    #2     A          1     3   2
    #3     B          0     1   3
    #4     B          0     2   3
    #5     B          1     3   3
    #6     B          0     4   3
    

    【讨论】:

    • 如果一个组的条件从未满足,会发生什么?也就是说,一组中永远没有值1?
    • 它为该玩家提供所有NaNs。
    • Nans 在numCondition 列中?如果是,更换NaNs 的最快方法是什么?
    • 是的。这就是它在版本 '0.20.3' 上的行为方式。
    • 你想用什么替换?如果你想用零替换NaNs,你应该可以用fillna(0) 来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    相关资源
    最近更新 更多