如何在Python中对数据帧进行分组并对连续数字的子组进行汇总?

2024-09-29 01:36:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,其中一列包含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”列中都有相应的连续数字序列。例如:

ID400包含一个长度为4{1,2,3,4}的序列和另一个长度为2{8,9}的序列

我想获得每个Id对应序列的平均长度。 在本例中:

df2 = {'ID':[400, 500], 'avg_length':[3, 2]}

任何想法都将不胜感激!你知道吗


Tags: 数据idnumber序列数字lengthavgdf1
2条回答

^{}+^{}+^{}

可以将groupby与自定义函数一起使用:

df = pd.DataFrame({'ID':[400, 400, 400, 400, 400, 400, 500, 500, 500, 500], 
                   'Number':[1, 2, 3, 4, 8, 9, 22, 23, 26, 27]})

def mean_count(x):
    return (x - x.shift()).ne(1).cumsum().value_counts().mean()

res = df.groupby('ID')['Number'].apply(mean_count).reset_index()

print(res)

    ID  Number
0  400     3.0
1  500     2.0

这里有一种方法,使用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)

相关问题 更多 >