У меня есть фрейм данных с неудачным выбором дизайна, который выглядит следующим образом: df = pd.DataFrame ({'Day': ['2021-03-01', '2021-03-01', '2021-03-02') , '2021-03-02', '2021-03-03'], 'Имя': ['Сэм', 'Сэм', ...

4
Awans 6 Апр 2021 в 02:09

2 ответа

Лучший ответ

Расплавьте столбцы, сравните столбец Day со столбцом variable, который содержит индексы дней, группировки, агрегирования (суммы), разделения и сброса:

(df
 .melt(['Day', 'Name', 'Fruit'])
 .loc[lambda df: df.Day.eq(df.variable)]
 .astype({"value": int})
 .groupby(['Day', 'Name', 'Fruit'])['value']
 .sum()
 .unstack(fill_value = 0)
 .add_prefix("nr")
 .reset_index()
 .rename_axis(columns = None)
 )
 
Fruit         Day   Name  nrApple  nrBanana
0      2021-03-01    Sam        3         0
1      2021-03-02   Jack        0         4
2      2021-03-02  Steve        2         0
3      2021-03-03  Steve        0         4
0
sammywemmy 5 Апр 2021 в 23:28
def fn(x):
    return (
        x.set_index("Fruit")
        .loc[:, x.Day.iat[0]]
        .astype(int)
        .groupby(level=0)
        .sum()
        .to_dict()
    )


df = (
    df.groupby(["Day", "Name"])
    .apply(fn)
    .apply(pd.Series)
    .add_prefix("nr")
    .reset_index()
    .fillna(0)
)
print(df)

Печать:

          Day   Name  nrApple  nrBanana
0  2021-03-01    Sam      3.0       0.0
1  2021-03-02   Jack      0.0       4.0
2  2021-03-02  Steve      2.0       0.0
3  2021-03-03  Steve      0.0       4.0
0
Andrej Kesely 5 Апр 2021 в 23:33