【问题标题】:pandas group by the column values with all values less than certain numbers and assign the group numbers as new columnspandas 按所有值小于特定数字的列值分组,并将组号分配为新列
【发布时间】:2020-01-04 10:30:19
【问题描述】:

我有一个这样的数据框,

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

我可以将前一个值与当前值进行比较并存储到一个列表中并使其成为 col3。

但是在这种情况下执行时间会很长,所以寻找一些快捷方式/pythonic方式来最有效地完成它。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    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),将 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
    

    【讨论】:

      猜你喜欢
      • 2021-02-15
      • 2021-05-23
      • 2014-11-21
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      • 2023-02-06
      • 2021-10-02
      • 1970-01-01
      相关资源
      最近更新 更多