заполнить значение в объекте группы pandas после заполнения отсутствующей даты - PullRequest
2 голосов
/ 22 октября 2019

было задано много похожих вопросов, мне это очень помогло, я последовал за помощью: Заполнить пропущенные даты групп и Панд - добавление пропущенных дат в DataFrame, в то время каксохраняя значения столбца / индекса?

однако это все еще не помогает.

Я сделал игрушечный набор данных, чтобы продемонстрировать проблему, с которой я столкнулся:

data = pd.DataFrame({'Date': ['2012-01-01', '2012-01-01','2012-01-01','2012-01-02','2012-01-02','2012-01-02','2012-01-03'], 'Id': ['21','21','22','21','22','23','21'], 'Quantity': ['5','1','4','4','2','1','4'], 'NetAmount': ['66','45','76','35','76','73','45']})

data['Quantity'] = data['Quantity'].astype('int')
data['NetAmount'] = data['NetAmount'].astype('float')

Я сгруппировал набор данных, как показано в коде ниже:

data['Date'] =pd.to_datetime(data.Date) - pd.to_timedelta(7,unit = 'd')

data =data.groupby(['Id',pd.Grouper(key='Date', freq='W-MON')])['Quantity', 'NetAmount'].sum().reset_index().sort_values('Date')
data.reset_index()
data1 = data.groupby(['Id','Date']).agg({'Quantity': sum, 'NetAmount': sum}).reset_index()

затемЯ заполняю пропущенные даты:

data2 = data1.set_index(['Date', 'Id','NetAmount']).Quantity.unstack(-3).\
    reindex(columns=pd.date_range(data1['Date'].min(), data1['Date'].max(),freq='W-MON'),fill_value=0).\
            stack(dropna=False).unstack().stack(dropna=False).\
                unstack('NetAmount').stack(dropna=False).fillna(0).reset_index()

, давая результирующий кадр данных:

   Id    level_1  NetAmount     0
0   21 2011-12-26       45.0   0.0
1   21 2011-12-26       73.0   0.0
2   21 2011-12-26      146.0  10.0
3   21 2011-12-26      152.0   0.0
4   21 2012-01-02       45.0   4.0
5   21 2012-01-02       73.0   0.0
6   21 2012-01-02      146.0   0.0
7   21 2012-01-02      152.0   0.0
8   22 2011-12-26       45.0   0.0
9   22 2011-12-26       73.0   0.0
10  22 2011-12-26      146.0   0.0
11  22 2011-12-26      152.0   6.0
12  22 2012-01-02       45.0   0.0
13  22 2012-01-02       73.0   0.0
14  22 2012-01-02      146.0   0.0
15  22 2012-01-02      152.0   0.0
16  23 2011-12-26       45.0   0.0
17  23 2011-12-26       73.0   1.0
18  23 2011-12-26      146.0   0.0
19  23 2011-12-26      152.0   0.0
20  23 2012-01-02       45.0   0.0
21  23 2012-01-02       73.0   0.0
22  23 2012-01-02      146.0   0.0
23  23 2012-01-02      152.0   0.0

, но на самом деле я ожидаю получить:

0   21 2011-12-26       66.0   5.0
1   21 2011-12-26       45.0   1.0
2   21 2011-12-26       35.0   4.0
3   21 2012-02-02       45.0   4.0
4   22 2011-12-26       76.0   4.0
5   22 2012-02-02       76.0   2.0
6   23 2011-12-26        0.0   0.0
7   23 2012-02-02       73.0   1.0

заполнение сработало,Тем не менее, я не понимаю, что на самом деле происходит в итоговом фрейме данных, для экземпляров в столбце netAmount результаты отключены. Я новичок в том, чтобы разбирать / складывать функцию. Я что-то упустил в процессе? Спасибо за любую помощь!

обновление: я попытался перегруппировать по id и данным после добавления значений "0":

data2 = pd.DataFrame(data2)
data3 = data2.groupby(['Id','Date']).agg({'Quantity': sum, 'NetAmount': sum}).reset_index()

, но я получаю эту ошибку

Traceback (most recent call last):
  File "", line 48, in <module>
    data3 = data2.groupby(['Id','Date']).agg({'Quantity': sum, 'NetAmount': sum}).reset_index()
  File "", line 7632, in groupby
    observed=observed, **kwargs)
  File "", line 2110, in groupby
    return klass(obj, by, **kwds)
  File "", line 360, in __init__
    mutated=self.mutated)
  File "", line 578, in _get_grouper
    raise KeyError(gpr)
KeyError: 'Date'

1 Ответ

1 голос
/ 22 октября 2019

Вам необходимо преобразовать столбцы Quantity и NetAmount в числовые значения

data['Quantity'] = data['Quantity'].astype('int')
data['NetAmount'] = data['NetAmount'].astype('float')

Когда столбцы являются строками, функция sum объединяет все строки по группам.

Теперьперезапустите ваш код, и он должен работать как положено

#   Id  level_1   NetAmount 0
#0  21  2011-12-26  45.0    0.0  
#1  21  2011-12-26  73.0    0.0
#2  21  2011-12-26  146.0   10.0
#3  21  2011-12-26  152.0   0.0
#4  21  2012-01-02  45.0    4.0
#5  21  2012-01-02  73.0    0.0
#6  21  2012-01-02  146.0   0.0
#7  21  2012-01-02  152.0   0.0
#8  22  2011-12-26  45.0    0.0
#9  22  2011-12-26  73.0    0.0
#10 22  2011-12-26  146.0   0.0
#11 22  2011-12-26  152.0   6.0
#12 22  2012-01-02  45.0    0.0
#13 22  2012-01-02  73.0    0.0
#14 22  2012-01-02  146.0   0.0
#15 22  2012-01-02  152.0   0.0
#16 23  2011-12-26  45.0    0.0
#17 23  2011-12-26  73.0    1.0
#18 23  2011-12-26  146.0   0.0
#19 23  2011-12-26  152.0   0.0
#20 23  2012-01-02  45.0    0.0
#21 23  2012-01-02  73.0    0.0
#22 23  2012-01-02  146.0   0.0
#23 23  2012-01-02  152.0   0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...