簡體   English   中英

pandas 按所有值小於特定數字的列值分組,並將組號分配為新列

[英]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->1False->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.

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