[英]Shifting columns in grouped pandas dataframe
我有一個數據框,按country
和group
分組后如下所示:
A B C D
country group
1 a1 10 20 30 40
a2 11 21 31 41
a3 12 22 32 42
a4 13 23 33 43
A B C D
country group
2 a1 50 60 70 80
a2 51 61 71 81
a3 52 62 72 82
a4 53 63 73 83
我的目標是創建另一列E
將D
列值向上移動 1 行,如下所示:
A B C D E
country group
1 a1 10 20 30 40 41
a2 11 21 31 41 42
a3 12 22 32 42 43
a4 13 23 33 43 nan
A B C D E
country group
2 a1 50 60 70 80 81
a2 51 61 71 81 82
a3 52 62 72 82 83
a4 53 63 73 83 nan
我試過的:
df.groupby(['country','group']).sum().apply(lambda x['E']: x['D'].shift(-1))
但我得到無效的語法。
之后,我試圖刪除存在nan
每個組中的那些底線,如下所示: df = df[~df.isin([np.nan]).any(1)]
有效。
如何將E
列添加到df
,該列將保留D
列值偏移-1
?
按第一級使用DataFrameGroupBy.shift
:
df = df.groupby(['country','group']).sum()
df['E'] = df.groupby(level=0)['D'].shift(-1)
然后是DataFrame.dropna
:
df = df.dropna(subset=['E'])
樣品:
print (df)
country group A B C D
0 1 a1 10 20 30 40
1 1 a1 11 21 31 41
2 1 a1 12 22 32 42
3 1 a2 13 23 33 43
4 1 a2 11 21 31 41
5 1 a2 12 22 32 42
6 1 a3 13 23 33 43
7 1 a3 11 21 31 41
8 1 a3 12 22 32 42
9 1 a4 13 23 33 43
10 1 a4 11 21 31 41
11 1 a5 12 22 32 42
12 1 a5 13 23 33 43
13 2 a2 50 60 70 80
14 2 a3 51 61 71 81
15 2 a4 52 62 72 82
16 2 a5 53 63 73 83
df = df.groupby(['country','group']).sum()
print (df)
A B C D
country group
1 a1 33 63 93 123
a2 36 66 96 126
a3 36 66 96 126
a4 24 44 64 84
a5 25 45 65 85
2 a2 50 60 70 80
a3 51 61 71 81
a4 52 62 72 82
a5 53 63 73 83
df['E'] = df.groupby(level=0)['D'].shift(-1)
print (df)
A B C D E
country group
1 a1 33 63 93 123 126.0
a2 36 66 96 126 126.0
a3 36 66 96 126 84.0
a4 24 44 64 84 85.0
a5 25 45 65 85 NaN
2 a2 50 60 70 80 81.0
a3 51 61 71 81 82.0
a4 52 62 72 82 83.0
a5 53 63 73 83 NaN
df = df.dropna(subset=['E'])
print (df)
A B C D E
country group
1 a1 33 63 93 123 126.0
a2 36 66 96 126 126.0
a3 36 66 96 126 84.0
a4 24 44 64 84 85.0
2 a2 50 60 70 80 81.0
a3 51 61 71 81 82.0
a4 52 62 72 82 83.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.