【问题标题】:Loop within column name在列名内循环
【发布时间】:2019-03-28 07:32:17
【问题描述】:

我有一个数据框,其中包含 car_x 和 car1_y、van2_x 和 van2_y 以及 bus3_x 和 bus3_y 列。我需要一列 car1_x * car1_y + van2_x * van2_y + bus3_x * bus3_y

以下代码不起作用:

modes = 'car', 'van', 'bus'

for mode in modes:
    df['{var}'] = df['{var}_x']*df['{var}_y']

然后我将在 df['car']、df['van'] 和 df['bus'] 之间求和,但上面的语法是关闭的。

【问题讨论】:

    标签: python pandas loops


    【解决方案1】:

    要修复你的代码,你需要使用 f-strings 来让 python 知道应该插入 {var} 作为它的值,而不是字符串 "{var}"

    for mode in modes:
        df[f'{var}'] = df[f'{var}_x'] * df[f'{var}_y']
    

    但这需要额外的求和步骤才能获得“结果”。

    df['result'] = df[list(modes)].sum(axis=1)
    

    让我们删掉额外的步骤,并在此处使用einsum 更快地执行此操作。过滤掉您的 _x_y 列,然后使用 einsum 指定求和运算。

    x = df.filter(like='_x')
    y = df.filter(like='_y')
    
    df['result'] = np.einsum('ij,ij->i', x, y)
    

    感谢filter 步骤,不再需要维护单独的modes 列表。

    【讨论】:

    • 非常感谢,我错过了 f。不过你的代码更干净。
    【解决方案2】:

    我将使用groupby

    df.groupby(df.columns.str.split('_').str[0],axis=1).prod()[['car', 'van', 'bus']].sum(1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 2012-08-21
      • 2016-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多