#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