我有这个数据框的数据,其中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。
答案 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()