微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我想在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 https://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用于辅助分组.最后按照注释中的建议添加排序函数以获得确切的功能

> 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐