Уникальные значения за последние 12 месяцев в Groupby в Pandas - PullRequest
1 голос
/ 22 января 2020

Как я могу сделать 12M в групповом режиме и вернуть уникальные значения (предпочтительно в списке) для каждой строки?

В настоящее время у меня есть pandas кадр данных, подобный следующему. Я бы sh сгруппировал их по itemId и заменил sellerId списком уникальных идентификаторов продавца за последние 12 месяцев (на основе действующей даты). Действующая дата представлена ​​в формате monthEnd. По сути, я хотел бы видеть для каждого itemId в каждом месяце, кто является уникальными идентификаторами продавца в течение последних 12 месяцев.

            itemId   sellerId   effectiveDate
    1975245 2585893  31280      2005-12-31
    1975246 2585893  31280      2006-02-28
    1975247 2585893  5407       2006-06-30
    1975248 2585893  5407       2006-08-31
    1975249 2585893  5407       2006-09-30
    1975250 2585893  5407       2006-11-30
    1975254 2585893  5407       2007-05-31
    1975257 2585893  5407       2007-06-30
    1975258 2585893  5407       2007-07-31
    1975259 2585893  5407       2008-03-31
    ...

Я хочу получить что-то вроде следующего:

            itemId  uniqueSellerIds effectiveDate
    1975245 2585893 [31280]         2005-12-31
    1975246 2585893 [31280]         2006-02-28
    1975247 2585893 [5407,31280]    2006-06-30
    1975248 2585893 [5407,31280]    2006-08-31
    ...

Я пытался использовать групповые, а затем и скользящие методы, но это не сработало. Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 22 января 2020

Я изменил исходный DataFrame следующим образом:

    itemId          sellerId   effectiveDate
    19752572585893  31280      2005-12-31
    19752572585893  31280      2006-02-28
    19752592585894  31280      2008-01-31
    19752592585894  5407       2007-07-31
    19752592585894  5407       2008-03-31
    19752592585894  5407       2008-01-31

Оттуда я отфильтровал его, чтобы иметь только самый последний год для каждого itemId:

df['effectiveDate'] = pd.to_datetime(df['effectiveDate'])
filtered = df[df.groupby(by=['itemId']).apply(lambda g: 
                                              g['effectiveDate'] >= 
                                              g['effectiveDate'].max() - 
                                              pd.Timedelta(days=365)).values]                                                            

Затем я sellerId s объединены следующим образом:

filtered.groupby(by=['itemId'])['sellerId'].agg(lambda x: x.unique().tolist())     

Осталось получить максимальные даты и объединить их с отфильтрованными и объединенными данными:

max_dates = filtered.groupby(by=['itemId'])['effectiveDate'].max()
modified_df = pd.concat([compressed,max_dates],axis=1)  

Результат:

                     sellerId effectiveDate
itemId                                     
19752572585893        [31280]    2006-02-28
19752592585894  [31280, 5407]    2008-03-31
1 голос
/ 22 января 2020

Как насчет использования dt.year?

new_df = df.groupby([df["effectiveDate"].dt.year, df["itemId"]])["sellerId"].agg(list).to_frame()

print(new_df)
                                    sellerId
effectiveDate     itemId                      
2005              1975245 2585893  [31280]
2006              1975246 2585893  [31280]
                  1975247 2585893   [5407]
                  1975248 2585893   [5407]
                  1975249 2585893   [5407]
                  1975250 2585893   [5407]
2007              1975254 2585893   [5407]
                  1975257 2585893   [5407]
                  1975258 2585893   [5407]
2008              1975259 2585893   [5407]
...