Итерация по строкам pandas df и выполнение операции - PullRequest
0 голосов
/ 17 мая 2018

У меня есть pandas dataframe, который выглядит следующим образом

    Date          SKU     Balance
0   1/1/2017        X1       8
1   1/1/2017        X2      45
2   1/1/2017        X1      47
3   1/1/2017        X2      16
4   2/1/2017        X1      14
5   2/1/2017        X2      67
6   2/1/2017        X2       9
8   2/1/2017        X1      66
9   2/1/2017        X1     158

Моя первая цель - создать несколько фреймов данных, отфильтрованных по дням

, для которых я кодировал

df_1stjan = df.query("Date == \"1/1/2017\"")

И я получил следующий результат

    Date          SKU     Balance
0   1/1/2017        X1       8
1   1/1/2017        X2      45
2   1/1/2017        X1      47
3   1/1/2017        X2      16

Моя вторая цель - сгруппировать SKU, и я кодировал

df_1stjan_uSKU = df_1stjan.groupby(['SKU','Date'], \
                         as_index=False).agg({'Balance':'sum'})

И я получил следующий результат

Date          SKU     Balance
0   1/1/2017        X1      55
1   1/1/2017        X2      61

В настоящее время я могу только написать код для генерации df только для одной даты за один раз

Но мне нужно написать функцию или цикл, чтобы автоматизировать его для всех дней 2017 года.

Обратите внимание, что в столбце Дата есть строка dtype

Ответы [ 2 ]

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

Я думаю, вы делаете это слишком сложным для себя.Вы в значительной степени решили свою собственную проблему, но я бы порекомендовал выполнить индексацию после начальных groupby и agg.

Пример кадра данных :

    Balance Date    SKU
0   8   1/1/2017    X1
1   45  1/1/2017    X2
2   47  1/1/2017    X1
3   16  1/1/2017    X2
4   22  1/2/2017    X3
5   24  1/2/2017    X3
6   25  1/3/2017    X4
7   3   1/3/2017    X4 

groupby с agg

df1 = df.groupby(['Date', 'SKU'], as_index=False).agg({'Balance':'sum'})

    Date    SKU Balance
0   1/1/2017    X1  55
1   1/1/2017    X2  61
2   1/2/2017    X3  46
3   1/3/2017    X4  28

to_datetime для преобразования Date столбец

df1['Date'] = pd.to_datetime(df1.Date, format='%m/%d/%Y')

date_range со всеми днями, к которым вы хотите получить доступ

dr = pd.date_range('20170101','20170103')

loc с циклом для доступа к срезу на каждый день

for d in dr:
    print(df1.loc[df1.Date.isin([d])])

        Date SKU  Balance
0 2017-01-01  X1       55
1 2017-01-01  X2       61

        Date SKU  Balance
2 2017-01-02  X3       46

        Date SKU  Balance
3 2017-01-03  X4       28
0 голосов
/ 17 мая 2018

Если вы делаете сначала

df_group = df.groupby(['Date', 'C1', 'C2', 'C3', 'SKU']).sum()

Тогда вы можете создать свои DFS, такие как:

for date in set(df['Date']):
    df_date = df_group.loc[date].reset_index()
    # and do whatever with df_date, you can save them in a list for example
    # to access them later but maybe the df_group.loc[date].reset_index() is enough for what you need
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...