【问题标题】:Why doesn't first and last in a groupby give me first and last为什么 groupby 中的 first and last 不给我 first and last
【发布时间】:2018-01-26 10:34:48
【问题描述】:

我发布此内容是因为该主题刚刚在另一个问题/答案中提出,并且该行为没有得到很好的记录。

考虑数据框df

df = pd.DataFrame(dict(
    A=list('xxxyyy'),
    B=[np.nan, 1, 2, 3, 4, np.nan]
))

   A    B
0  x  NaN
1  x  1.0
2  x  2.0
3  y  3.0
4  y  4.0
5  y  NaN

我想获取由列'A' 定义的每个组的第一行和最后一行。

我试过了

df.groupby('A').B.agg(['first', 'last'])

   first  last
A             
x    1.0   2.0
y    3.0   4.0

但是,这并没有给我预期的np.NaNs。

如何获得每组中的实际第一个和最后一个值?

【问题讨论】:

  • 请注意df.groupby('A').B.agg(['idxmax', 'idxmin'])first()last() 保持相同的结果

标签: python pandas group-by pandas-groupby


【解决方案1】:

here @unutbu 所述:

groupby.firstgroupby.last 方法分别返回第一个和最后一个非空值。

要获取实际的第一个和最后一个值,请执行以下操作:

def h(x):
    return x.values[0]

def t(x):
    return x.values[-1]

df.groupby('A').B.agg([h, t])

     h    t
A          
x  NaN  2.0
y  3.0  NaN

【讨论】:

    【解决方案2】:

    一种选择是使用.nth 方法:

    >>> gb = df.groupby('A')
    >>> gb.nth(0)
         B
    A
    x  NaN
    y  3.0
    >>> gb.nth(-1)
         B
    A
    x  2.0
    y  NaN
    >>>
    

    但是,我还没有找到一种方法来整齐地聚合它们。当然,总是可以使用pd.DataFrame 构造函数:

    >>> pd.DataFrame({'first':gb.B.nth(0), 'last':gb.B.nth(-1)})
       first  last
    A
    x    NaN   2.0
    y    3.0   NaN
    

    注意:我明确使用了gb.B属性,否则你必须使用.squeeze

    【讨论】:

    • 不知道nth
    • @piRSquared 是的,确实有点晦涩。
    • (lambda g: pd.DataFrame(dict(first=g.nth(0), last=g.nth(-1))))(df.groupby('A').B)
    • 甚至添加minmax 到它(-:...(lambda g: g.agg(['min', 'max']).join(pd.DataFrame(dict(first=g.nth(0), last=g.nth(-1)))))(df.groupby('A').B)
    猜你喜欢
    • 2018-04-06
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2012-04-22
    • 2020-09-21
    • 2022-12-02
    • 2020-10-11
    相关资源
    最近更新 更多