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

标签 python pandas

我想在 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/

相关文章:

python - 限制 re.findall 引用中的字数

python - 数据框中非数字和零值单元格的索引

python - pandas matplotlib .plot(kind ='hist') vs .plot(kind ='bar') 问题

python - Julia 数据框与 Python Pandas

python - Airflow 1.10.9 - 无法从 '_check_google_client_version' 导入名称 'pandas_gbq.gbq'

python - 对 Pandas Dataframe 构造函数中的两个字段执行计算/算术运算

python - 在 Jython 中使用 JavaCV

Python 文件写入在 docker 中不起作用

python - 如何知道 cython 程序正在使用 numpy+MKL 还是不使用 MKL?

python - 如何使一个数据框与另一数据框保持相同的行?