【问题标题】:Iterate through the rows of a dataframe and reassign minimum values by group遍历数据框的行并按组重新分配最小值
【发布时间】:2017-01-13 08:15:53
【问题描述】:

我正在使用一个看起来像这样的数据框。

  id time diff
0 0   34   nan
1 0   36   2
2 1   43   7
3 1   55   12
4 1   59   4
5 2   2    -57
6 2   10   8

什么是通过 id 找到 'time' 的最小值,然后在这些最小值处将 'diff' 设置为 nan 的有效方法。我正在寻找一种解决方案,结果是:

   id time diff
0 0   34   nan
1 0   36   2
2 1   43   nan
3 1   55   12
4 1   59   4
5 2   2    nan
6 2   10   8

【问题讨论】:

  • 感谢您发布示例,但我仍然不明白您要做什么。通过 id 找到最小值并将它们设置为 nans?那么为什么 id=1 的 7 设置为 nan 而不是 4?
  • 我正在尝试将每组 id 时间最少的项目设置为 nan。

标签: python pandas dataframe group-by pandas-groupby


【解决方案1】:

groupby('id') 并使用idxmin 查找'time' 的最小值的位置。最后用loc赋值np.nan

df.loc[df.groupby('id').time.idxmin(), 'diff'] = np.nan
df

【讨论】:

    【解决方案2】:

    您可以通过id对时间进行分组,并计算一个逻辑向量,如果该组内的时间最小,则值为True,否则为False,并使用逻辑向量将NaN分配给相应的行:

    import numpy as np
    import pandas as pd
    df.loc[df.groupby('id')['time'].apply(lambda g: g == min(g)), "diff"] = np.nan
    
    df
    #  id   time    diff
    #0  0     34    NaN
    #1  0     36    2.0
    #2  1     43    NaN
    #3  1     55    12.0
    #4  1     59    4.0
    #5  2      2    NaN
    #6  2     10    8.0
    

    【讨论】:

      猜你喜欢
      • 2016-11-28
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 2020-03-22
      • 2021-05-06
      • 2021-03-31
      相关资源
      最近更新 更多