как решить ошибку «Переиндексация действительна только для однозначных объектов индекса» - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть датафрейм, который выглядит примерно так:

           date        holiday  item_cnt_day    shop_id      cnt_sem    cnt_mes     cnt_year
0        2013-01-01       1         0.0           59         0.000000   0.000000    0.000000
1        2013-01-02       1         0.0           59         0.000000   0.000000    0.000000
2        2013-01-03       1         0.0           59         0.000000   0.000000    0.000000
3        2013-01-04       1         0.0           59         0.000000   0.000000    0.000000
4        2013-01-05       0         0.0           59         0.000000   0.000000    0.000000
          ......         ...        ...           ...           ...        ...         ...
1029    2015-10-27        0         4.0           36         1.142857   0.321429    0.024658
1030    2015-10-28        0         1.0           36         1.285714   0.357143    0.027397
1031    2015-10-29        0         1.0           36         1.142857   0.392857    0.030137
1032    2015-10-30        0         4.0           36         1.714286   0.535714    0.041096
1033    2015-10-31        0         1.0           36         1.857143   0.571429    0.043836

даты начинаются с 2013-01-01 по 2015-10-31, и этот диапазон дат для каждого shop_id, то есть для каждого shop_id у меня есть этот диапазон дат, поэтому у меня есть повторяющиеся даты, но я пытаюсь сделать так, чтобы были только те даты, которые идут после первых 365 дней для shop_id, и я пытаюсь сделать это с помощью с помощью этой функции:

def no_todos(df, shops):
    # shops is a list of shops and there are 60 shops in this list
    # df is the dataframe to be operated in the loop

    new_df = pd.DataFrame(df)

    # Here I'm trying to only keep those observations which come after the first 365 days for each shop
    for t in shops:
        new_df['shop_id'][t] = df[365::]
    return new_df

Однако у меня возникает эта ошибка: Переиндексация действительна только для объектов индекса с уникальным значением. Кто-нибудь знает, как решить эту проблему? Заранее спасибо.

1 Ответ

0 голосов
/ 14 апреля 2020

Сначала отсортируйте фрейм данных, затем сгруппируйте, а затем выполните отрицательный хвост. Отрицательный хвост не реализован в методе groupby tail, поэтому вам нужно создать свою собственную функцию. Это пропустит первые строки каждой группы

df.sort_values(['shop_id', 'date'], ascending=[True, True])

def negative_tail(group, n):
    return group._selected_obj[group.cumcount(ascending=True) >= n]

final_result = negative_tail(df.groupby('shop_id'), 365).copy()
...