2015-12-04 4 views
3

У меня есть dataframe вроде этого:Как выполнять операции над группами в панд

ID A B Area 
0 1 A1 B1 1.0 
1 2 A1 B2 2.0 
2 3 A1 B1 0.5 
3 4 A1 B2 1.0 
4 5 A2 B3 2.0 
5 6 A2 B4 6.0 

То, что я хочу, чтобы выйти на это:

ID A B Area B as % of A 
0 1 A1 B1 1.0 0.333 
1 2 A1 B2 2.0 0.666 
2 3 A1 B1 0.5 0.333 
3 4 A1 B2 1.0 0.666 
4 5 A2 B3 2.0 0.25 
5 6 A2 B4 6.0 0.75 

Цель состоит в том, чтобы добавить новый столбец, который дает долю площади каждого этажа A, которая учитывается каждым типом комнаты B (обратите внимание, что это тип комнаты, поэтому значение в столбце вывода должно быть одинаковым для каждой уникальной комбинации A и B).

До сих пор, что у меня есть:

>>> grouped = df.groupby(['A','B']) 
>>> area_proportion = lambda x: (x['Area']/x['Area'].sum()) 
>>> grouped.transform(area_proportion) 

Но это, кажется, лечение лямбда как по индексу оригинального dataframe (я думал, что это будет группой), поскольку она просто возвращает:

Out[142]: 
    ID Area 
0 1 1.0 
1 2 2.0 
2 3 0.5 
3 4 1.0 
4 5 2.0 
5 6 6.0 

Я, очевидно, неправильно понимаю что-то или отсутствует жизненно важная часть документов. Как я должен использовать groupby для получения нужного результата?

ответ

3

Возможно:

>>> aggr = lambda df, key, col: df.groupby(key)[col].transform('sum') 
>>> df['B as % of A'] = aggr(df, ('A', 'B'), 'Area')/aggr(df, 'A', 'Area') 
>>> df 
    ID A B Area B as % of A 
0 1 A1 B1 1.0  0.3333 
1 2 A1 B2 2.0  0.6667 
2 3 A1 B1 0.5  0.3333 
3 4 A1 B2 1.0  0.6667 
4 5 A2 B3 2.0  0.2500 
5 6 A2 B4 6.0  0.7500 
+0

Ваш взгляд% неправильно – EdChum

+0

Хм, я думаю, что я был смущен тем, что есть повторяющиеся записи, таким образом они должны рассматриваться как эквивалент, а не отдельных записей – EdChum

+0

Это правильно. –

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