2015-10-05 4 views
1

У меня есть этот dataframe с данными, где df ['two'] = 0 фильтруется, а затем я сгруппировал его в последовательных «подгруппах», показывая ответ в «результатах».Получить статистику по подгруппам в pandas

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 ['three'] для второй «подгруппы» ([5,6] в результатах), это будет среднее значение 5-й и 6-й строк для столбца «три», поэтому среднее значение 5 и 8. . Или, если я хочу знать максимальную третью «подгруппу» [9,10,11,12,13], это будет 26.

ответ

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() 
1

Если вы хотите сохранить исходные значения в «результаты» вы можете использовать другой список «сдвиг» индекс (значение 1 в результатах [1] для первого примера [5,6]):

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

Тогда получить свой подмножество:

sub = df.iloc[results2] 

И вычислить среднее:

sub['three'].mean() 
+1

благодарит за ваш ответ. Раньше не было достаточно ясно. Что делать, если мне нужно получить среднее значение для каждой из подгрупп в очень большой базе данных, а не только одну из них? пытался сделать «для i в диапазоне (len (results))» перед «для элемента в результатах [i]», что вы сделали, но не работали для меня ... – Gabriel

Смежные вопросы