簡體   English   中英

帶有 groupby 的 Pandas 數據框:如何為每組中的第一行和最后一行創建指示變量

[英]Pandas data frame with groupby: How to create indicator variable for the first and last rows in each group

假設我有一個這樣的數據框:

      X
  0  10
  1  10
  2  10
  3  10
  4  20
  5  20
  6  30
  7  30
  8  30
  9  30

我打算在df.groupby(['X']).apply(function)操作中使用它。 我想用指示器變量創建額外的列來標記每個組開始和結束的行。 我想創建一個這樣的新框架(我將 False 縮寫為 F)

     X  First_X  Last_X
0  10  True     F
1  10  F        F
2  10  F        F
3  10  F        True
4  20  True     F
5  20  F        True
6  30  True     F
7  30  F        F
8  30  F        F
9  30  F        True

我該怎么做?

在我對兩列或更多列進行 groupby 操作的情況下,同樣的問題。 例如: df.groupby(['X','Y']).apply(function) 對於第二個變量,我標記了第一個變量創建的組中的第一行和最后一行。

     X     Y
0  10    1
1  10    1
2  10    2
3  10    2
4  20    3
5  20    4
6  30    5
7  30    5
8  30    5
9  30    6

結果框架應該是

    X    Y   First_X  Last_X  First_Y  Last_Y
0  10    1   True     F       True     F
1  10    1   F        F       F        True
2  10    2   F        F       True     F
2  10    2   F        True    F        True
3  20    3   True     F       True     True
4  20    4   F        True    True     True
5  30    5   True     F       True     F
6  30    5   F        F       F        F
7  30    5   F        F       F        True
8  30    6   F        True    True     True

使用DataFrame.shiftDataFrame.merge是解決問題的正確方法嗎?

謝謝你。

第一個問題;

df=df.assign(First_X=df.X.ne(df.X.shift()),Last_X=df.X.ne(df.X.shift(-1)))

第二個

print(df3)

    X  Y First_X Last_X
0  10  1    True      F
1  10  1       F      F
2  10  2       F      F
2  10  2       F   True
3  20  3    True      F
4  20  4       F   True
5  30  5    True      F
6  30  5       F      F
7  30  5       F      F
8  30  6       F   True



df3=df3.assign(First_Y=df3.groupby(['X','Y'])['Y']\
    .apply(lambda x: x.ne(x.shift())),Last_Y=df3.groupby\
    (['X','Y'])['Y'].apply(lambda x: x.ne(x.shift(-1))))



    X  Y First_X Last_X  First_Y  Last_Y
0  10  1    True      F     True   False
1  10  1       F      F    False    True
2  10  2       F      F     True   False
2  10  2       F   True    False    True
3  20  3    True      F     True    True
4  20  4       F   True     True    True
5  30  5    True      F     True   False
6  30  5       F      F    False   False
7  30  5       F      F    False    True
8  30  6       F   True     True    True

對於第一個問題,受到這里類似問題的啟發:

df['first'] = False
df['last'] = False

def set_cols(df):
  df['first'].iloc[0] = True
  df['last'].iloc[-1] = True
  return df

df = df.groupby('X').apply(set_cols)

給出想要的結果。

df.assign(
first_ind=lambda df: pd.Series(data=1, index=df.groupby('X')['Y'].idxmin()),
last_ind=lambda df: pd.Series(data=1, index=df.groupby('X')['Y'].idxmax()))

暫無
暫無

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

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