Панды - Объединить df.loc для нескольких операций?

1

Есть ли способ выполнить один поиск df.loc, но затем выполнить несколько операций над подмножеством строк?

Вот мотивация. У меня есть 2 кадра данных с данными о тех же пользователях. Я перебираю df_2.groupby('user_id') а затем просматриваю другой фрейм данных, чтобы назначить некоторые значения:

for user, user_df in df_2.groupby('user_id'):
    df_1.loc[df_1.user_id == user, 'value_1'] == user_df.value_1.mean()
    df_1.loc[df_1.user_id == user, 'value_2'] == user_df.value_2.min()

я мог бы объединить их каким-то образом, чтобы выполнить только один df.loc, но назначить оба значения?

  • 0
    Было бы полезно предоставить примеры двух ваших фреймов данных, таких как df_1.head(10) и df_2.head(10)
Теги:
pandas
pandas-groupby

2 ответа

1

Вы можете выровнять индексы, а затем использовать in-place pd.DataFrame.update:

df_1 = df_1.set_index('user_id')
df_1.update(df_2.groupby('user_id')[['value_1', 'value_2']].mean())

Обратите внимание, что это также устраняет необходимость в цикле уровня for уровне Python.

  • 0
    Проблема здесь в том, что операция сводки не так гибка, как мне нужно - например, она должна быть .mean() для всех столбцов.
  • 0
    Тогда просто используйте df_2.groupby('user_id', as_index=False).mean() ?
0

Я уверен, что следующее будет работать:

grouped = df_2.groupby('user_id').agg({'value1': 'mean', 'value2': 'min'})
df_1 = df_1.merge(grouped, left_on='user_id', right_index=True, sort=False)

Это требует, чтобы value1 и value2 не были в df_1, иначе у вас будут повторяющиеся столбцы. Если это потенциальная проблема, используйте df_1 = df_1.drop(columns=['value1', 'value2'], errors='ignore') до слияния.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню