Как объединить результаты операции 'groupby' на нескольких разных фреймах данных - PullRequest
2 голосов
/ 01 мая 2019

Я прочитал серию CSV-файлов. Каждый содержит историю данных транзакции для другого пользователя. Мне нужна сводка сумм транзакций по дням недели для всей группы. Сделать сводку для каждого пользователя легко, но у меня проблема с агрегацией результатов

Для каждого пользователя данные выглядят примерно так:

id  data_import_id  posted  amount
00000000  3c221ff  2014-01-02T19:00:00.000-05:00  3656506
00000013  3c221ff  2014-01-02T19:00:00.000-05:00  3656506
00000015  3c221ff  2014-01-04T19:00:00.000-05:00  3656506
0000000a  3c221ff  2014-01-05T19:00:00.000-05:00  3656506
00000001  3c221ff  2014-01-06T19:00:00.000-05:00  3656506

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

Список данных в совокупном виде выглядит примерно так для двух пользователей:

[           amount
weekday          
Monday      43118
Wednesday  5872780,             amount
weekday           
Friday        1249
Monday     2566648
Wednesday    12000]

Из этого списка я хочу сгенерировать один фрейм данных, содержащий всего два столбца: «день недели» и «сумма», где сумма - это общее количество за день для всех пользователей.

Код, который я использую, приведен ниже, и он выдает «ValueError: Невозможно преобразовать сумму столбца в класс типа int». Я также пытался использовать 'append' и 'join', но не смог заставить их работать, возможно, потому что Dataframes не все одного размера. TIA для любой помощи / руководства.

def assess(df):
    # Create list to hold results
    cumulative = []
    for frame in df:
        # Produce a Dataframe that summarizes a users weekday totals
        total_amounts = frame.groupby(["weekday"])[["amount"]].sum()
        cumulative.append(total_amounts)
        print(cumulative)
        # *** The problem is here *** 
        cumulative.set_index("weekday").join(total_amounts.set_index("weekday"))
    return cumulative

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Вот один из способов использования concat, затем groupby

df=pd.concat(list_of_dfs,keys=np.arange(len(list_of_dfs)))
df['weekday']=df.posted.dt.day_name()
l=[y.sum() for x ,y in df.groupby([df.index.get_level_values(0),df.weekday])['amount']]

Если они нужны в кадре данных

yourdf=df.groupby([df.index.get_level_values(0),df.weekday])['amount'].sum()
0 голосов
/ 01 мая 2019

Вы можете использовать Series.dt.date_name для этого и передать это функции groupby:

df_new = df.groupby(df.posted.dt.day_name())['amount'].sum()

print(df_new)
posted
Monday      3656506
Saturday    3656506
Sunday      3656506
Thursday    7313012
Name: amount, dtype: int64
...