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

Bri*_*ian 15 python group-by dataframe pandas pandas-groupby

我有一个数据帧 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'])
Run Code Online (Sandbox Code Playgroud)

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

我试过了

df.groupby(level=0).agg(['first', 'last']).stack()
Run Code Online (Sandbox Code Playgroud)

得到了

          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
Run Code Online (Sandbox Code Playgroud)

这非常接近我想要的.如何保留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
Run Code Online (Sandbox Code Playgroud)

piR*_*red 18

选项1

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

df.groupby(level=0, group_keys=False).apply(first_last)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


选项2 - 仅在索引是唯一的情况下才有效

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

选项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])
Run Code Online (Sandbox Code Playgroud)

注意

每个@unutbu:agg(['first', 'last'])取第一个非na值.

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

我们来包括另一个测试

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

df.loc[tuple('aa'), 'X'] = np.nan
Run Code Online (Sandbox Code Playgroud)
def first_last(df):
    return df.ix[[0, -1]]

df.groupby(level=0, group_keys=False).apply(first_last)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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])
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

果然!第二个解决方案是获取第X列中的第一个有效值.现在,强制该值与索引a对齐是没有意义的.

  • 即使它看起来更复杂,当有很多组时,`reset_index/agg`解决方案明显比`groupby/apply`解决方案快得多.例如,当`df = pd.DataFrame(np.random.randint(100,size =(10**3,4)),columns = list('ABCD')).set_index(['A','B} ']).rename_axis([None,None])`. (5认同)

小智 12

请试试这个:

对于最后一个值:df.groupby('Column_name').nth(-1),

对于第一个值: df.groupby('Column_name').nth(0)


Aka*_*ain 5

这可能是简单的解决方案。

df.groupby(level = 0, as_index= False).nth([0,-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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。(是)