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

时间:2015-05-18 17:05:15

标签: 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']

但我确信必须有一个更优雅的解决方案

1 个答案:

答案 0 :(得分:2)

在最佳代码方面不是那么好,但解决了问题

Parse.Cloud.define("logbookEntries", function(request, response) {

  //::: Query 1 :::
  var firstQuery = new Parse.Query("Logbook");
  var returnData = []; 

  firstQuery.find().then(function(firstResults) {
    returnData[0] = firstResults; 

  }).then(function(result) {  

    //::: Query 2 :::
    var secondQuery = new Parse.Query("Logbook"); 
    secondQuery.find().then(function(secondResults))
    returnData[1] = secondResults; 

  }).then(function(result) {
    response.success(returnData);

  }, function(error) {
    response.error(error);

  });
});

我们无法单独使用> df_group = df.groupby('id') id,因此根据groupby中的groupby是否连续添加另一个新列

id

现在我们可以将新列> 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