【问题标题】:Count each group sequentially pandas按顺序计算每组熊猫
【发布时间】:2018-02-17 03:59:48
【问题描述】:

我有一个按两列分组的 df。我想按顺序计算每个组。下面的代码按顺序计算组内的每一行。这似乎比我想象的要容易,但无法弄清楚。

df = pd.DataFrame({
    'Key': ['10003', '10009', '10009', '10009',
            '10009', '10034', '10034', '10034'], 
    'Date1': [20120506, 20120506, 20120506, 20120506,
              20120620, 20120206, 20120206, 20120405],
    'Date2': [20120528, 20120507, 20120615, 20120629,
              20120621, 20120305, 20120506, 20120506]
})


df['Count'] = df.groupby(['Key','Date1']).cumcount() + 1

预期结果:

    Date1       Date2       Key    Count
0   20120506    20120528    10003  1
1   20120506    20120507    10009  2
2   20120506    20120615    10009  2
3   20120506    20120629    10009  2
4   20120620    20120621    10009  3
5   20120206    20120305    10034  4
6   20120206    20120506    10034  4
7   20120405    20120506    10034  5

【问题讨论】:

    标签: python pandas dataframe group-by pandas-groupby


    【解决方案1】:

    您正在寻找groupby + ngroup

    df['Count'] = df.groupby(['Key','Date1']).ngroup() + 1
    df
    
          Date1     Date2    Key  Count
    0  20120506  20120528  10003      1
    1  20120506  20120507  10009      2
    2  20120506  20120615  10009      2
    3  20120506  20120629  10009      2
    4  20120620  20120621  10009      3
    5  20120206  20120305  10034      4
    6  20120206  20120506  10034      4
    7  20120405  20120506  10034      5
    

    ngroup 只是给每个组一个标签。

    【讨论】:

    • 值得注意的是这是在 20.2 中添加的
    • @WillAyd 感谢您的注意 :) 是的,用户需要升级到最新版本才能使用它。
    【解决方案2】:

    或者categorypd.factorize 也可以为它工作

    (df['Key'].astype(str)+df['Date1'].astype(str)).astype('category').cat.codes.add(1)
    Out[60]: 
    0    1
    1    2
    2    2
    3    2
    4    3
    5    4
    6    4
    7    5
    dtype: int8
    

    【讨论】:

    • 酷!另一个非集体选择。但请注意,您还需要在 Date1 上进行分组。
    • @cᴏʟᴅsᴘᴇᴇᴅ 是的,但仍需要修复
    【解决方案3】:

    您可以使用pd.factorize 标记唯一值,可以是tuples

    df['Count'] = pd.factorize(list(zip(df.Key, df.Date1)))[0] + 1
    df
    
          Date1     Date2    Key  Count
    0  20120506  20120528  10003      1
    1  20120506  20120507  10009      2
    2  20120506  20120615  10009      2
    3  20120506  20120629  10009      2
    4  20120620  20120621  10009      3
    5  20120206  20120305  10034      4
    6  20120206  20120506  10034      4
    7  20120405  20120506  10034      5
    

    【讨论】:

    • 有点道理,你可以像这样标记元组......很好。
    猜你喜欢
    • 2019-11-03
    • 2021-11-11
    • 2020-03-24
    • 1970-01-01
    • 2015-03-26
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    相关资源
    最近更新 更多