为什么 groupby 中的 first 和 last 不给我 first 和 last

Why doesn't first and last in a groupby give me first and last

我发布这个是因为这个话题刚刚在另一个 question/answer 中被提出,并且行为没有很好的记录。

考虑数据帧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.NaN

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

如前所述 by @unutbu:

groupby.first and groupby.last 方法分别 return 第一个和最后一个非空值。

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

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

一种选择是使用 .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