Pivot_table Pandas удаляет NaT даты - PullRequest
0 голосов
/ 04 мая 2018

У меня возникла проблема при создании сводной таблицы в пандах. Проблема здесь заключается в значении NaT в поле datetime. Допустим, у меня есть такой набор данных:

import pandas as pd
import numpy as np

values = [5,2,1,3,4,5,6,7,5,10]
names = ['Name1'] * 3 + ['Name2'] * 3 + ['Name3'] * 4
dates = pd.DataFrame({'year': [2015, 2015] * 5,
                       'month': [2, 3] * 5,
                       'day': [4, 5] * 5})
dates_dt = pd.to_datetime(dates)
dates_dt.loc[1] = pd.NaT
df = pd.DataFrame({'Name': names, 'Date': dates_dt, 'Values': values})
df

, который выглядит так:

        Date   Name  Values
0 2015-02-04  Name1       5
1        NaT  Name1       2
2 2015-02-04  Name1       1
3 2015-03-05  Name2       3
4 2015-02-04  Name2       4
5 2015-03-05  Name2       5
6 2015-02-04  Name3       6
7 2015-03-05  Name3       7
8 2015-02-04  Name3       5
9 2015-03-05  Name3      10

когда я создаю сводную таблицу, которая суммирует значения с датой и именем в качестве индекса, у меня нет строки, соответствующей Name1 и NaT в столбце даты:

pd.pivot_table(
    df,
    values='Values',
    index=['Name', 'Date'],
    aggfunc=np.sum,
    fill_value=0
).reset_index()

Результирующая сводная таблица:

    Name       Date  Values
0  Name1 2015-02-04       6
1  Name2 2015-02-04       4
2  Name2 2015-03-05       8
3  Name3 2015-02-04      11
4  Name3 2015-03-05      17

Есть ли какой-нибудь элегантный способ (вместо преобразования даты в строку), который помог бы мне не потерять информацию об имени1 и неизвестной дате?

1 Ответ

0 голосов
/ 04 мая 2018

fill_value - это значение, заменяющее пропущенные значения в столбцах values, а не в index. Я не знаю чистого решения вашей проблемы, но вот случайное - вы можете временно заменить NaT s на некоторую временную метку, которая, как вы уверены, не встречается в вашем наборе данных:

df = df.replace(pd.NaT, pd.Timestamp(0))
(pd.pivot_table(
        df,
        values='Values',
        index=['Name', 'Date'],
        aggfunc=np.sum)
   .reset_index()
   .replace(pd.Timestamp(0), pd.NaT))
#     Name       Date  Values
# 0  Name1        NaT       2
# 1  Name1 2015-02-04       6
# 2  Name2 2015-02-04       4
# 3  Name2 2015-03-05       8
# 4  Name3 2015-02-04      11
# 5  Name3 2015-03-05      17
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...