gpt4 book ai didi

python - 获取 groupby 中的第一个和最后一个值

转载 作者:太空狗 更新时间:2023-10-29 17:43:05 24 4
gpt4 key购买 nike

我有一个数据框df

df = pd.DataFrame(np.arange(20).reshape(10, -1),
[['a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd'],
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']],
['X', 'Y'])

如何获取第一行和最后一行,并按索引的第一级分组?

我试过了

df.groupby(level=0).agg(['first', 'last']).stack()

得到了

          X   Y
a first 0 1
last 6 7
b first 8 9
last 12 13
c first 14 15
last 16 17
d first 18 19
last 18 19

这与我想要的非常接近。如何保留 1 级索引并改为获取此索引:

      X   Y
a a 0 1
d 6 7
b e 8 9
g 12 13
c h 14 15
i 16 17
d j 18 19
j 18 19

最佳答案

选项 1

def first_last(df):
return df.ix[[0, -1]]

df.groupby(level=0, group_keys=False).apply(first_last)

enter image description here


选项 2 - 仅在索引唯一时有效

idx = df.index.to_series().groupby(level=0).agg(['first', 'last']).stack()
df.loc[idx]

选项 3 - 根据下面的注释,这仅在没有 NA 时才有意义

我还滥用了 agg 函数。下面的代码有效,但更难看。

df.reset_index(1).groupby(level=0).agg(['first', 'last']).stack() \
.set_index('level_1', append=True).reset_index(1, drop=True) \
.rename_axis([None, None])

注意事项

根据@unutbu:agg(['first', 'last']) 取第一个非 na 值。

我将其解释为,必须逐列运行此列。此外,强制索引 level=1 对齐甚至可能没有意义。

让我们加入另一个测试

df = pd.DataFrame(np.arange(20).reshape(10, -1),
[list('aaaabbbccd'),
list('abcdefghij')],
list('XY'))

df.loc[tuple('aa'), 'X'] = np.nan

def first_last(df):
return df.ix[[0, -1]]

df.groupby(level=0, group_keys=False).apply(first_last)

enter image description here

df.reset_index(1).groupby(level=0).agg(['first', 'last']).stack() \
.set_index('level_1', append=True).reset_index(1, drop=True) \
.rename_axis([None, None])

enter image description here

果然如此!第二种解决方案是采用 X 列中的第一个有效值。现在强制该值与索引 a 对齐是荒谬的。

关于python - 获取 groupby 中的第一个和最后一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38797271/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com