2015-12-28 3 views
1

Я просто попадаю в Панды и пытаюсь создать электронную таблицу для автомобильной партии. Я люблю панд, но это происходит медленно, и я пытаюсь создать несколько новых столбцов, что сумма ...Условное суммирование по файловому фрейму python

import pandas as pd 

data = pd.DataFrame({"Car":["Hyundai","Hyundai","Honda", "Honda"], "Type":["Accent", "Accent", "Civic", "Civic"], "Trans":["Auto", "Manual", "Auto", "Manual"], "TOTAL":[2,4,5,3]}) 

print data 

print data.groupby(['Car', 'Type', 'Trans'])['TOTAL'].sum() 

Я получаю полностью предсказуемы ....

 Car TOTAL Trans Type 
0 Hyundai  2 Auto Accent 
1 Hyundai  4 Manual Accent 
2 Honda  5 Auto Civic 
3 Honda  3 Manual Civic 

Car  Type Trans 
Honda Civic Auto  5 
       Manual 3 
Hyundai Accent Auto  2 
       Manual 4 

В идеале что я хотел бы, чтобы снять это .....

Car  Type Auto Manual Total 
Honda  Civic  5  3  8 
Hyundai Accent 2  4  6 

Мои знания не так уж велика из панд (пока), но я предполагаю, что это «применить» или функция AGG() но пока, синтаксически, я ударяю голову из синтаксических ошибок, но Я ценю любые указатели в правильном направлении. .. JW

ответ

1

Вы можете подготовить две новые серии загодя в кадре данных с автоматическим и ручным подсчетом.

data['total_manual'] = data['TOTAL'] * (data['Trans'] == 'Manual').astype(int) 
data['total_auto'] = data['TOTAL'] * (data['Trans'] == 'Auto').astype(int) 
print data.groupby(['Car', 'Type'])['total_auto', 'total_manual', 'TOTAL'].sum() 

Также аналогичный подход заключается в использовании сводной таблицы с полями.

pvt = pd.pivot_table(data, index=['Car', 'Type'], columns='Trans', values='TOTAL', margins='columns', aggfunc=np.sum) 
pvt = pvt.drop(('All',''), axis=0) 
+0

Доказательства положительного Дэвид, что иногда мне просто нужно настроить то, что я думаю. Отмечено как ответ! –

2

Чтобы использовать встроенный pandas методов, вы можете: установить вашу 'Car', 'Type', 'Trans'columns как индекс и unstack() получить Total для каждой подгруппы, а затем просто сумма по columns:

data = pd.DataFrame({"Car":["Hyundai","Hyundai","Honda", "Honda"], "Type":["Accent", "Accent", "Civic", "Civic"], "Trans":["Auto", "Manual", "Auto", "Manual"], "TOTAL":[2,4,5,3]}).set_index(['Car', 'Type', 'Trans']) 

total_by_trans = data.unstack().loc[:, 'TOTAL']   # to get rid of the column MultiIndex created by unstack() 
total_by_trans['Total'] = total_by_trans.sum(axis=1)  
total_by_trans.columns.name = None      # just cleaning up 

       Auto Manual Total 
Car  Type      
Honda Civic  5  3  8 
Hyundai Accent  2  4  6 
+0

О! Не могу дождаться, чтобы попробовать это! –

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