我有一个dataframe,其中一列包含id,另一列包含数字:

df1 = {'ID':[400, 400, 400, 400, 400, 400, 500, 500, 500, 500],
      'Number':[1, 2, 3, 4, 8, 9, 22, 23, 26, 27]}

您可能会注意到,每个Id在“Number”列中都有相应的连续编号序列。例如:
Id 400包含一个长度为4{1,2,3,4}的序列和另一个长度为2{8,9}的序列
我想获得每个I d对应序列的平均长度。
在本例中:
df2 = {'ID':[400, 500], 'avg_length':[3, 2]}

任何想法都将不胜感激!

最佳答案

有一种方法,使用groupby两次,

df1['tmp'] = (df1.Number - df1.Number.shift() > 1).cumsum()

df1.groupby(['ID', 'tmp']).Number.count().groupby(level = 0).mean().reset_index(name = 'avg_length')

2.29 ms ± 75.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

    ID  avg_length
0   400 3
1   500 2

选项2:不使用apply两次,仍然使用前面创建的tmp列
df1.groupby('ID').tmp.apply(lambda x: x.value_counts().mean()).reset_index(name = 'avg_length')

2.25 ms ± 99.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

关于python - 如何在Python中对数据框进行分组并汇总连续数字的子组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53416534/

10-16 01:02