Сводная таблица pandas с использованием суммы (min_count = 1) в pandas 0.22

Я переношу свой код на Pandas 0.22 и сталкиваюсь с проблемой со сводной таблицей. В версии 0.20 у меня есть строка кода. Это имеет такое поведение, когда, когда ячейка в сводной таблице пуста, агрегирование суммы возвращает NAN.

workload_pivot_df = pd.pivot_table(workload_df, index=["athlete_id", "date"], values=["workload"], columns=["type"], aggfunc=('sum','last'))

Однако из-за изменения в Pandas 0.22 sum теперь возвращает 0, если данные не найдены. В документации говорится, что вы можете передать min_count = 1 в качестве аргумента, чтобы получить исходное поведение https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sum.html. Однако я не могу заставить это работать в сводной таблице.

Можете ли вы предоставить минимальные данные о том, где вы обнаружили эту проблему?

jpp 11.04.2018 14:14
2
1
374
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать функцию lambda и для того же имени столбца использовать tuple - первое значение - это новое имя столбца, а вторая агрегатная функция:

tup = ('sum', lambda x: x.sum(min_count=1))
workload_pivot_df = pd.pivot_table(workload_df, index=["athlete_id", "date"], 
                                    values=["workload"], 
                                    columns=["type"], aggfunc=(tup,'last'))

Образец:

workload_df = pd.DataFrame({'athlete_id':list('aaabbb'),
                   'date':pd.to_datetime(['2015-01-01'] * 3 + ['2015-01-01'] * 3),
                   'workload':[np.nan,np.nan,np.nan,4,2,3],
                   'type':list('aaaabb')})

print (workload_df)
  athlete_id       date type  workload
0          a 2015-01-01    a       NaN
1          a 2015-01-01    a       NaN
2          a 2015-01-01    a       NaN
3          b 2015-01-01    a       4.0
4          b 2015-01-01    b       2.0
5          b 2015-01-01    b       3.0

workload_pivot_df = pd.pivot_table(workload_df, index=["athlete_id", "date"], 
                                    values=["workload"], 
                                    columns=["type"], aggfunc=('sum','last'))

print (workload_pivot_df)
                      workload               
                          last       sum     
type                         a    b    a    b
athlete_id date                              
a          2015-01-01      NaN  NaN  0.0  NaN #<-all NaNs created 0.0
b          2015-01-01      4.0  3.0  4.0  5.0


tup = ('sum', lambda x: x.sum(min_count=1))
workload_pivot_df = pd.pivot_table(workload_df, index=["athlete_id", "date"], 
                                    values=["workload"], 
                                    columns=["type"], aggfunc=(tup,'last'))

print (workload_pivot_df)
                      workload               
                          last       sum     
type                         a    b    a    b
athlete_id date                              
a          2015-01-01      NaN  NaN  NaN  NaN #<-back compatible need NaN
b          2015-01-01      4.0  3.0  4.0  5.0

@warwickh - Рад помочь!

jezrael 11.04.2018 14:33

Другие вопросы по теме