【问题标题】:Efficiently enumerate rows in bins for each group in DataFrame为 DataFrame 中的每个组有效地枚举 bin 中的行
【发布时间】:2021-05-29 08:03:42
【问题描述】:

我正在尝试找到一种方法来灵活地更改我在 pandas 数据框中为每个组分箱的行数。

每个组 ID 有 ~700 行,我想添加一个名为 bin_number 的列,以便从 0 开始它重复 0 以达到我想要的 bin 长度,然后 bin_number 将是 1并重复n次等等。

所以,假设我想要 10 个中的 bin_length,我将有 70 个 bin,并且 bin 编号将从 0 到 69 重复 10 次,从每个 ID 组重新开始。该列将如下所示:

0
0
0 (repeating bin_length number of times)
.
.
1
1
1 

如果它可以灵活地适应每组中不同的行数,那就更好了。

这是我一直在使用的方法,但它似乎不是正确的方法。

df.groupby("ID").apply(lambda x: np.arange(len(df)) // 10)

任何指针表示赞赏!谢谢!

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    试试groupby cumcout + //

    df['bins'] = df.groupby('ID').cumcount() // bin_len
    

    样本 DF bin 长度为 2:

        ID  bins
    0    1     0
    1    1     0
    2    1     1
    3    1     1
    4    1     2
    5    1     2
    6    1     3
    7    1     3
    8    2     0
    9    2     0
    10   2     1
    11   2     1
    12   2     2
    13   2     2
    14   2     3
    15   2     3
    

    完整的工作示例:

    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame({
        'ID': np.repeat(np.arange(1, 3), 8)
    })
    
    bin_len = 2
    
    df['bins'] = df.groupby('ID').cumcount() // bin_len
    
    print(df)
    

    【讨论】:

      猜你喜欢
      • 2013-06-18
      • 2017-11-27
      • 2020-10-06
      • 2021-05-03
      • 2021-11-12
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多