Pandas Group By Условия

1

Вот мои данные -

FROM    TO  DIRECTION    AMOUNT  
B    A    IN    100
A    B    OUT    200
A    B    IN    300
B    A    OUT    40

В качестве вывода я хочу показать резюме того, кто заплатил, кто в итоге -

FROM    TO    AMOUNT
A    B    300
B    A    340

Чтобы уточнить, если A → B - это строки 2 и 1 (IN означает перевод с TO на FROM, OUT означает передачу из FROM в TO)

У меня проблемы с выходом .groupby(). То, что я пробовал -

df.groupby(['FROM', 'TO', 'DIRECTION'])

Но, конечно, это, похоже, не режет. Любая помощь оценивается.

Теги:
pandas
group-by

1 ответ

3
Лучший ответ

Идея - это значения подкачки FROM и TO по условию:

mask = df['DIRECTION'] == 'IN'
df.loc[mask, ['TO', 'FROM']] = df.loc[mask, ['FROM', 'TO']].values
print (df)
  FROM TO DIRECTION  AMOUNT
0    A  B        IN     100
1    A  B       OUT     200
2    B  A        IN     300
3    B  A       OUT      40

А затем суммарная sum:

df = df.groupby(['FROM', 'TO'], as_index=False)['AMOUNT'].sum()
print (df)
  FROM TO  AMOUNT
0    A  B     300
1    B  A     340

Очень похожее решение, если вы не хотите изменять оригинальный DataFrame:

mask = df['DIRECTION'] == 'IN'
df1 = df[['TO','FROM']].mask(mask, df[['FROM','TO']].values)
#output is same like above, only changed order of columns
print (df1)
  TO FROM
0  B    A
1  B    A
2  A    B
3  A    B

df2 = df['AMOUNT'].groupby([df1['FROM'], df1['TO']]).sum().reset_index()
print (df2)
  FROM TO  AMOUNT
0    A  B     300
1    B  A     340

Ещё вопросы

Сообщество Overcoder
Наверх
Меню