【问题标题】:Pandas DataFrame groupby overlapping intervals of variable lengthPandas DataFrame groupby 可变长度的重叠间隔
【发布时间】:2016-01-22 03:04:51
【问题描述】:

我正在尝试按 2 列对 DataFrame 进行分组(参见下面的示例)。 对于第一列,我希望每个值都属于一个组。对于第二列,我想按大小不等的重叠间隔进行分组。

我的理解是 pd.cut() 只允许我按非重叠间隔进行分组。

这是一个例子:

    0   1   2
0   0   4   1721
1   0   5   2353
2   0   6   58
3   0   7   524
4   1   1   1934
5   1   2   1318
6   1   2   1307
7   1   2   301
8   1   2   502
9   1   3   996
10  1   3   32

按我想要的第 0 列和第 1 列分组:

0  1    2
0 [4,5] [1721,2353]
  [5,6] [2353,58]
  [6,7] [58,524]
1 [1,2] [1934,1318,1307,301,502]
  [2,3] [1318,1307,301,502,996,32]

然后我会取第 2 列的平均值或标准值。有什么建议吗?谢谢 !

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    开始于:

        gr1  gr2   val
    0     0    4  1721
    1     0    5  2353
    2     0    6    58
    3     0    7   524
    4     1    1  1934
    5     1    2  1318
    6     1    2  1307
    7     1    2   301
    8     1    2   502
    9     1    3   996
    10    1    3    32
    

    首先,根据gr2 中的值创建分箱:

    bounds = df.gr2.sort_values().unique()
    bins = list(zip(bounds[:-1], bounds[1:]))
    
    def overlapping_bins(x):
        return pd.Series([l for l in bins if l[0] <= x <= l[1]])
    

    然后将val的值赋给bins

    df = pd.concat([df, df.gr2.apply(overlapping_bins).stack().reset_index(1, drop=True)], axis=1).rename(columns={0: 'bins'}).drop('gr2', axis=1)
    

    然后.groupby() 产生bins

    df.groupby(['gr1', 'bins']).val.apply(lambda x: x.tolist())
    
    gr1  bins  
    0    (3, 4)                             [1721]
         (4, 5)                       [1721, 2353]
         (5, 6)                         [2353, 58]
         (6, 7)                          [58, 524]
    1    (1, 2)       [1934, 1318, 1307, 301, 502]
         (2, 3)    [1318, 1307, 301, 502, 996, 32]
         (3, 4)                          [996, 32]
    

    【讨论】:

    • 这有帮助吗?
    • 当然对我有帮助。对于将来的其他人,如果您将 object 作为索引而不是编号为 0..n,则在 pd.concat() 中使用 join='inner' 至少对我有帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 2023-04-10
    • 2018-04-12
    • 2021-02-19
    • 1970-01-01
    相关资源
    最近更新 更多