2017-01-30 3 views
2

позволяет сказать, что у меня есть следующий панд dataframe, и я пытаюсь опубликовать процесс результатов для создания моих (ныне пустые) итоговые строк:Creating подвел итоговые строки в панде dataframe с определенными критериями

code entry_type value1 value2 value3 value4 
1 A  Holding  1.1  1.2  1.3  1.4 
2 A  Holding  2.1  2.2  2.3  2.4 
3 B  Holding  3.1  3.2  3.3  3.4 
4 C  Holding  4.1  4.2  4.3  4.4 
5 C  Holding  5.1  5.2  5.3  5.4 
6 A  Summary  nan  nan  nan  nan 
7 C  Summary  nan  nan  nan  nan 
8 B  Summary  nan  nan  nan  nan 

По существу, Я хотел бы value1-Value4 в кратких строках быть суммой фондов в каждом из кода:

code entry_type value1 value2 value3 value4 
1 A  Holding  1.1  1.2  1.3  1.4 
2 A  Holding  2.1  2.2  2.3  2.4 
3 B  Holding  3.1  3.2  3.3  3.4 
4 C  Holding  4.1  4.2  4.3  4.4 
5 C  Holding  5.1  5.2  5.3  5.4 
6 A  Summary  3.2  3.4  3.6  3.8 
7 C  Summary  9.2  9.4  9.6  9.8 
8 B  Summary  3.1  3.2  3.3  3.4 

Я попытался несколько группы по строкам коды, и придумал следующее:

set = df[df['entry_type']=="Holding"].groupby('code')[['value1', 'value2', 'value3', 'value4']].sum() 

Что дает:

 value1 value2 value3 value4 
code 
    A 3.2  3.4  3.6  3.8 
    B 3.1  3.2  3.3  3.4 
    C 9.2  9.4  9.6  9.8 

Однако я не уверен, как я бы применить это обратно к первоначальному DataFrame, в частности, в связи с тем, что код заказа не обязательно совпадает с исходным DataFrame. Любые мысли о том, как применить это? Или лучший подход? (Обратите внимание: в итоговых строках в других столбцах уже есть куча дополнительных данных, поэтому я не могу просто генерировать новые строки inline).

ответ

4

кажется concat может поможет:

df1 = df[df['entry_type']=="Holding"] 
     .groupby('code')[['value1', 'value2', 'value3', 'value4']].sum() 
#print (df1) 

#if need filter `df` for only rows with Holding use boolean indexing 
print (pd.concat([df[df['entry_type']=="Holding"].set_index('code'), df1]) 
     .fillna({'entry_type':'Summary'}) 
     .reset_index()) 

    code entry_type value1 value2 value3 value4 
0 A Holding  1.1  1.2  1.3  1.4 
1 A Holding  2.1  2.2  2.3  2.4 
2 B Holding  3.1  3.2  3.3  3.4 
3 C Holding  4.1  4.2  4.3  4.4 
4 C Holding  5.1  5.2  5.3  5.4 
5 A Summary  3.2  3.4  3.6  3.8 
6 B Summary  3.1  3.2  3.3  3.4 
7 C Summary  9.2  9.4  9.6  9.8 

Другим возможным решением с combine_first для замены NaN на df1 с совместятся по index значений df:

print (df.set_index('code') 
     .combine_first(df1) 
     .sort_values(['entry_type']) 
     .reset_index()) 

    code entry_type value1 value2 value3 value4 
0 A Holding  1.1  1.2  1.3  1.4 
1 A Holding  2.1  2.2  2.3  2.4 
2 B Holding  3.1  3.2  3.3  3.4 
3 C Holding  4.1  4.2  4.3  4.4 
4 C Holding  5.1  5.2  5.3  5.4 
5 A Summary  3.2  3.4  3.6  3.8 
6 B Summary  3.1  3.2  3.3  3.4 
7 C Summary  9.2  9.4  9.6  9.8 
Смежные вопросы