gpt4 book ai didi

python - Pandas groupby将不连续的视为不同的变量?

转载 作者:太空宇宙 更新时间:2023-11-03 11:27:55 24 4
gpt4 key购买 nike

我想在 groupby 期间将非连续的 id 视为不同的变量,这样我就可以将返回的第一个 stamp 值和增量的总和作为一个新的数据帧。这是示例输入和输出。

import pandas as pd
import numpy as np

df = pd.DataFrame([np.array(['a','a','a','b','c','b','b','a','a','a']),
np.arange(1, 11), np.ones(10)]).T

df.columns = ['id', 'stamp', 'increment']

df_result = pd.DataFrame([ np.array(['a','b','c','b','a']),
np.array([1,4,5,6,8]), np.array([3,1,1,2,3])]).T

df_result.columns = ['id', 'stamp', 'increment_sum']

In [2]: df
Out[2]:
id stamp increment
0 a 1 1
1 a 2 1
2 a 3 1
3 b 4 1
4 c 5 1
5 b 6 1
6 b 7 1
7 a 8 1
8 a 9 1
9 a 10 1

In [3]: df_result
Out[3]:
id stamp increment_sum
0 a 1 3
1 b 4 1
2 c 5 1
3 b 6 2
4 a 8 3

我可以通过

def get_result(d):
sum = d.increment.sum()
stamp = d.stamp.min()
name = d.id.max()
return name, stamp, sum

#idea from http://stackoverflow.com/questions/25147091/combine-consecutive-rows-with-the-same-column-values
df['key'] = (df['id'] != df['id'].shift(1)).astype(int).cumsum()

result = zip(*df.groupby([df.key]).apply(get_result))

df = pd.DataFrame(np.array(result).T)
df.columns = ['id', 'stamp', 'increment_sum']

但我敢肯定一定有更优雅的解决方案

最佳答案

在优化代码方面不是很好,但解决了问题

> df_group = df.groupby('id')

我们不能使用 id单独为 groupby ,因此在 id 内向 groupby 添加另一个新列基于是否连续

> df['group_diff'] = df_group['stamp'].diff().apply(lambda v: float('nan') if v == 1 else v).ffill().fillna(0)
> df
id stamp increment group_diff
0 a 1 1 0
1 a 2 1 0
2 a 3 1 0
3 b 4 1 0
4 c 5 1 0
5 b 6 1 2
6 b 7 1 2
7 a 8 1 5
8 a 9 1 5
9 a 10 1 5

现在我们可以使用新列 group_diff用于二次分组.. 已添加 sort最后按照评论中的建议运行以获得确切的功能

> df.groupby(['id','group_diff']).agg({'increment':sum, 'stamp': 'first'}).reset_index()[['id', 'stamp','increment']].sort('stamp')

id stamp increment
0 a 1 3
2 b 4 1
4 c 5 1
3 b 6 2
1 a 8 3

关于python - Pandas groupby将不连续的视为不同的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30309050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com