簡體   English   中英

獲取groupby中的第一個和最后一個值

[英]get first and last values in a 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'])

如何獲取按索引第一級分組的第一行和最后一行?

我試過了

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)

在此輸入圖像描述


選項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值。

我將其解釋為,必須按列運行此列。 此外,強制索引級別= 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)

在此輸入圖像描述

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])

在此輸入圖像描述

果然! 第二個解決方案是獲取第X列中的第一個有效值。現在,強制該值與索引a對齊是沒有意義的。

這可以是簡單的解決方案。

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

希望這可以幫助。 (Y)

請試試這個:

對於最后一個值: df.groupby('Column_name').nth(-1)

對於第一個值: df.groupby('Column_name').nth(0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM