[英]pandas group by the column values with all values less than certain numbers and assign the group numbers as new columns
我有一個這樣的數據框,
df
col1 col2
A 2
B 3
C 1
D 4
E 6
F 1
G 2
H 8
I 1
J 10
現在我想創建另一列 col3,將所有低於 5 的 col2 值分組,並將 col3 值保持為 1 到組數,因此最終數據框如下所示,
col1 col2 col3
A 2 1
B 3 1
C 1 1
D 4 1
E 6 2
F 1 2
G 2 2
H 8 3
I 1 3
J 10 4
我可以這樣做比較 prev 值與當前值並存儲到列表中並使其成為 col3。
但是在這種情況下執行時間會很長,所以尋找一些快捷方式/pythonic 方法來最有效地完成它。
通過Series.gt
比較>
然后使用Series.cumsum
。 新列總是從0
開始,因為列的第一個值不像5
,否則它應該是1
:
df['col3'] = df['col2'].gt(5).cumsum()
print (df)
col1 col2 col3
0 A 2 0
1 B 3 0
2 C 1 0
3 D 4 0
4 E 6 1
5 F 1 1
6 G 2 1
7 H 8 2
8 I 1 2
9 J 10 3
因此,對於從1
開始的通用解決方案,請使用此技巧 - 如果小於5
則比較第一個值,轉換為False->0
True->1
和False->0
整數並添加到列:
N = 5
df['col3'] = df['col2'].gt(N).cumsum() + int(df.loc[0, 'col2'] < 5)
df = df.assign(col21 = df['col2'].add(pd.Series({0:5}), fill_value=0).astype(int))
N = 5
df['col3'] = df['col2'].gt(N).cumsum() + int(df.loc[0, 'col2'] < N)
#test for first value > 5
df['col31'] = df['col21'].gt(N).cumsum() + int(df.loc[0, 'col21'] < N)
print (df)
col1 col2 col21 col3 col31
0 A 2 7 1 1
1 B 3 3 1 1
2 C 1 1 1 1
3 D 4 4 1 1
4 E 6 6 2 2
5 F 1 1 2 2
6 G 2 2 2 2
7 H 8 8 3 3
8 I 1 1 3 3
9 J 10 10 4 4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.