вычисленные строки с логикой и добавление в фрейм данных на python

#python #pandas #dataframe

Вопрос:

У меня есть df

Тип Имя Дата сумма
пт J 1/31/2021 30
АП J 1/31/2021 10
АП Q 1/31/2021 10
пт Q 1/31/2021 20

……1000 строк

Я пытаюсь добавить тип строк с именем AF в фрейм данных на основе логики: для того же имени и даты количество типов AC — количество типов AP

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

Тип Имя Дата сумма
пт J 1/31/2021 30
АП J 1/31/2021 10
АП Q 1/31/2021 10
пт Q 1/31/2021 20
AF J 1/31/2021 20
AF Q 1/31/2021 10

Я пробовал несколько способов даже с помощью pivot в python, но все еще не мог понять.

Ответ №1:

Используйте DataFrame.pivot_table для изменения формы, чтобы можно было создать новый столбец subtract , для использования в исходном формате DataFrame.stack :

 df1 = df.pivot_table(index=['Name','Date'], columns='Type', values='amount', aggfunc='sum')

df1['AF'] = df1['AC'].sub(df1['AP'])
df1 = df1.stack().reset_index(name='amount').reindex(df.columns, axis=1)
print (df1)
  Type Name       Date  amount
0   AC    J  1/31/2021      30
1   AP    J  1/31/2021      10
2   AF    J  1/31/2021      20
3   AC    Q  1/31/2021      20
4   AP    Q  1/31/2021      10
5   AF    Q  1/31/2021      10
 

Если важен порядок , используйте аналогичное решение , например, другой ответ (теперь удален), агрегируйте sum , вычитайте DataFrame.xs , добавьте новый столбец DataFrame.assign и последнее использование DataFrame.append в исходный кадр данных:

 df1 = df.groupby(['Name', 'Date', 'Type']).sum()

df1 = df.append(df1.xs('AC', level='Type')
                   .sub(df1.xs('AP', level='Type'))
                   .assign(Type='AF')
                   .reset_index(), ignore_index=True)
print (df1) 
  Type Name       Date  amount
0   AC    J  1/31/2021      30
1   AP    J  1/31/2021      10
2   AP    Q  1/31/2021      10
3   AC    Q  1/31/2021      20
4   AF    J  1/31/2021      20
5   AF    Q  1/31/2021      10