[英]How to create a data frame for each group in the pandas.groupby function?
[英]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.shift
和DataFrame.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.