从pandas中的子组获取统计信息

时间:2015-10-05 16:45:01

标签: python pandas itertools

我有这个数据框的数据,其中df [' two'] = 0被过滤,然后我将它分组到连续的"子组"在"结果"中显示答案。

import pandas as pd
import numpy as np
import itertools
import operator

index = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p']
df  = pd.DataFrame(index=index)
df['one']  = range(16)
df['two'] = [-1,0,0,-1,1,0,0,-1,-1,0,0,0,0,0,-1,1]
df['three'] =  [0,1,3,5,5,8,10,12,13,17,18,20,22,24,25,26]

df_filter = df[((df['two']==0))]
df_filter_list = df_filter.one.tolist()

results = []
for k, g in itertools.groupby(enumerate(df_filter_list), lambda (i,x):i-x):
        group = map(operator.itemgetter(1), g)
        results.append(group)

print results 
[[1, 2], [5, 6], [9, 10, 11, 12, 13]]

现在我的问题是,如何使用"结果"的值?并返回获取某列的每个不同子组的统计数据?

例如,如果我想知道第二个"子组"的df ['三']的平均值? ([5,6]在结果中)它将是第3行和第3行的第5行和第6行的平均值,因此平均值为5和8。 或者如果我想知道第三个"子组的最大值" [9,10,11,12,13]这将是26。

2 个答案:

答案 0 :(得分:1)

如果你必须在“结果”中保留原始值,你可以使用另一个列表来“移动”索引(结果[1]中的值1是[5,6]的第一个例子):

results2=[]
for item in results[1]:
    results2.append(item -1)

然后得到你的子集:

sub = df.iloc[results2]

计算平均值:

sub['three'].mean()

答案 1 :(得分:1)

实际上只是稍微调整一下你的答案,并意识到你如何使用iloc,指出我正是我需要的。发布以防万一对某人有用:

而不是这样做会给你只有子组1的统计数据:

results2=[]
for item in results[1]:
    results2.append(item -1)
sub = df.iloc[results2]
sub['three'].mean()

我刚刚做了这个,这会给你每个子组的平均值(或任何你需要的)。

for z in range(len(results)):
    sub =  df.iloc[results[z]]
    print sub['three'].mean()