Есть ли способ выполнить один поиск 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, но назначить оба значения?
Вы можете выровнять индексы, а затем использовать 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.
.mean()
для всех столбцов.
df_2.groupby('user_id', as_index=False).mean()
?
Я уверен, что следующее будет работать:
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')
до слияния.
df_1.head(10)
иdf_2.head(10)