【问题标题】:Pandas - Combine df.loc for multiple operations?Pandas - 结合 df.loc 进行多项操作?
【发布时间】:2018-10-15 23:50:30
【问题描述】:

有没有办法执行一次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,但同时分配两个值?

【问题讨论】:

  • 提供两个数据帧的样本会很有帮助,例如df_1.head(10)df_2.head(10)

标签: python pandas pandas-groupby


【解决方案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())

请注意,这也消除了对 Python 级 for 循环的需要。

【讨论】:

  • 这里的问题是汇总操作没有我需要的那么灵活——例如对于所有列,它必须是 .mean()
  • 那么就用df_2.groupby('user_id', as_index=False).mean()?
【解决方案2】:

我很确定以下方法会起作用:

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)

这要求value1value2 不能在df_1 中,否则会有重复的列。如果这是一个潜在问题,请在合并前使用df_1 = df_1.drop(columns=['value1', 'value2'], errors='ignore')

【讨论】:

    猜你喜欢
    • 2022-10-19
    • 2018-02-01
    • 1970-01-01
    • 2020-08-20
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多