如何对数据帧进行分组并汇总 Python 中连续数字的子组?
How to group a dataframe and summarize over subgroups of consecutive numbers in 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" 列中都有其对应的一系列连续数字。例如:
Id 400 包含一系列长度为 4 {1, 2, 3, 4} 和另一个长度为 2 {8, 9}
我想为每个 Id 获取其对应系列的平均长度。
在这个例子中:
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:不使用两次应用,仍然使用之前创建的 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)
groupby
+ cumsum
+ value_counts
您可以将 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
我有一个数据框,其中一列包含 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}
我想为每个 Id 获取其对应系列的平均长度。 在这个例子中:
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:不使用两次应用,仍然使用之前创建的 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)
groupby
+ cumsum
+ value_counts
您可以将 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