【问题标题】:An efficient way to multiply two dataframes based on a condition on a certain column根据特定列上的条件将两个数据帧相乘的有效方法
【发布时间】:2020-10-27 22:21:04
【问题描述】:

我想根据条件以一种有效的方式将两个数据帧 df1 和 df2 相乘。

df1:

df1 = pd.DataFrame(columns=['user_id', 'gender', 'value_1', 'value_2', 'value_3'], data = [[112,0,50,60,70], [73,10,20,40,55],[61, 0, 15, 30, 45]])

    user_id   gender   value_1   value_2   value_3
0   112       0         50         60        70
1   73        10        20         40        55
2   61        0         15         30        45

df2:

df2 = pd.DataFrame(columns=['gender', 'value_1', 'value_2', 'value_3'], data = [[2, 3, 5, 0], [4, 6, 7, 10]])

          value_1    value_2    value_3    gender
0         2          3          5          0
1         4          6          7          10

我想将 df1 的 value_1、value_2、value_3 列乘以 df2,其中性别列在两个数据框中都匹配。 我已通过以下方式完成此操作,并且效果很好:

val_cols = ['value_1', 'value_2', 'value_3']
df1.loc[df1.gender==0, val_cols] *= df2[df2.gender==0][val_cols].values[0].tolist()
df1.loc[df1.gender==10, val_cols] *= df2[df2.gender==10][val_cols].values[0].tolist()

但这仅适用于性别列只有几个值的情况,在这种情况下它只能是 0 和 10。但是如果有更多不同的性别值怎么办? 如果性别值以及 df2 中的记录数较高,是否有更好的方法来执行此操作? PS:我的真实数据框非常大,所以我不能使用 apply 或 map 函数。

【问题讨论】:

    标签: python pandas performance dataframe


    【解决方案1】:

    您可以在两个数据帧上 .set_index()gender,然后执行 df.mul():

    df1 = pd.DataFrame(columns=['user_id', 'gender', 'value_1', 'value_2', 'value_3'], data = [[112,0,50,60,70], [73,10,20,40,55],[61, 0, 15, 30, 45]])
    df2 = pd.DataFrame(columns=['value_1', 'value_2', 'value_3', 'gender'], data = [[2, 3, 5, 0], [4, 6, 7, 10]])
    
    df1 = df1.set_index(['gender', 'user_id'])
    df2 = df2.set_index('gender')
    
    out = df1.mul(df2, level=0)
    print(out)
    

    打印:

                    value_1  value_2  value_3
    gender user_id                           
    0      112          100      180      350
    10     73            80      240      385
    0      61            30       90      225
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 2021-06-18
      • 1970-01-01
      • 2022-11-27
      • 2020-02-02
      相关资源
      最近更新 更多