как решить ошибку «Переиндексация действительна только с уникальными значениями объектов индекса»

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

           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

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


person brenda    schedule 14.04.2020    source источник
comment
Я не понимаю вопроса должным образом, вы хотите сохранить только дни после первых 365 каждого магазина и сохранить их в своем новом фрейме данных, верно?   -  person jcaliz    schedule 14.04.2020
comment
Да, и ответ, который вы предоставили, делает именно то, что я хотел.   -  person brenda    schedule 14.04.2020


Ответы (1)


Сначала отсортируйте кадр данных, затем выполните группировку, а затем сделайте отрицательный хвост. Отрицательный хвост не реализован в методе 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()
person jcaliz    schedule 14.04.2020