2015-03-27 5 views
1

Благодарим заблаговременно, новый для python, оцените помощь.Извлечение данных из объекта генератора

Используйте несколько файлов csv для создания фрейма данных, который я хочу фильтровать с помощью нескольких параметров pandas .asfreq(), создания объекта генератора, сортировки и списка результатов.

import pandas as pd 
import numpy as np 

N = 100 
dates = pd.date_range('19971002', periods=N, freq='B') 
df=pd.DataFrame(np.random.randn(len(dates),1),index=dates,columns=list('A')) 
df1=pd.DataFrame(np.random.randn(len(dates),1),index=dates,columns=list('B')) 
pieces = (df, df1) 
data = pd.concat((pieces), join='outer', axis = 1) 
df['custIndex'] = (df.groupby([df.index.year, df.index.month]).cumcount()+1) # 'CI' = custIndex increments by 1 for each occurance since month inception 

data.head() 

time_sets = ['W-Mon', 'W-Tue'] 
for time_set in time_sets: 
    grouped = data.asfreq(time_set).groupby(df.custIndex).sum() 
    print time_set 
    print grouped.head() 


W-Mon 
       A   B 
custIndex      
1   1.827512 -0.487051 
3   -0.463776 -0.002071 
6   2.074173 -0.232500 
8   -0.282901 0.575820 
11   0.505265 -3.844740 
W-Tue 
       A   B 
custIndex      
2   1.347802 -0.738638 
4   0.273424 0.218833 
7   1.439177 3.671049 
9   1.722703 -0.962877 
12  -3.415453 1.123824 

Вот где у меня проблемы, цель состоит в том, чтобы отсортировать значения столбца «A» и «B» (верхние значения в начале), и извлекать custIndex с наибольшими значениями, и список custIndex, значение и столбец.

t = (group.sort_index(by='',ascending=True)for key, group in grouped) 

Нужна помощь с тем, что для сортировки, попробовал несколько («CI», «ключ») вещи, не повезло.

t 
<generator object <genexpr> at 0x000000000AA9A318> 

top = pd.DataFrame() 

for line in t: 
top = top.append(line) 

ValueError: need more than 1 value to unpack 

Цель будет выглядеть следующим образом:

custIndex value  time_set Column 
6   2.074173 W_MON  A 
1   1.827512 W-MON  A 
9   1.722703 W-TUE  B 

Спасибо еще раз.

ответ

1

Для того, чтобы ваш выражения генератора к работе, вам необходимо изменить его следующим образом:

t = (group.sort_index(ascending=True) for key, group in grouped.iteritems()) 

Несмотря на то, что может «работать», он все еще может не делать то, что вы намерены. Чтобы увидеть результат, вы можете попробовать:

for line in t: 
    print line 

Для предлагаемого решения, как о:

top_n = 5 # The number of top items returned. 
goal = pd.DataFrame([[None] * 4] * top_n, # 4 = number of columns 
        columns=['custIndex', 'value', 'time_set', 'Column']) 
for time_set in time_sets: 
    grouped = data.asfreq(time_set).groupby(df.custIndex).sum() 
    t = (group for group in grouped.unstack().iteritems()) 
    for [column, custIndex], val in t: 
     if val > min(goal.value): 
      # Append item to end of goal DataFrame and then re-sort. 
      goal.iloc[-1] = [custIndex, val, time_set, column] 
      goal.sort('value', ascending=False, inplace=True) 

goal.set_index(['custIndex', 'time_set', 'Column'], inplace=True) 

>>> goal 
          value 
custIndex time_set Column   
12  W-Tue B  3.048822 
5   W-Fri A  2.63997 
18  W-Wed B  2.570899 
10  W-Wed B  2.493457 
19  W-Thu B  2.164974 
+0

Wow! Спасибо, хорошо, за мой класс, но именно то, что я искал. Благодарим вас за ответ и за то, что помогли мне добраться до следующего уровня питона, отличные вещи! Спасибо! – Rayl54292

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