【问题标题】:Conditional elementwise multiplication of two pandas dataframes两个熊猫数据帧的条件元素乘法
【发布时间】:2018-11-23 12:09:09
【问题描述】:

我正在努力在两个数据帧之间进行基本的条件元素乘法。 假设我有以下两个数据框:

df1 = pd.DataFrame({'A': [-0.1,0.3,-0.4, 0.8,-0.5,-0.1,0.3,-0.4, 0.8,-1.2],'B': [-0.2,0.5,0.3,-0.5,0.1,-0.2,0.5,0.3,-0.5,0.9]},index=[0, 1, 2, 3,4,5,6,7,8,9])
df2=pd.DataFrame({'C': [-0.003,0.03848,-0.04404, 0.018,-0.1515,-0.02181,0.233,-0.0044, 0.01458,-0.015],'D': [-0.0152,0.0155,0.03,-0.0155,0.0151,-0.012,0.035,0.0013,-0.0005,0.009]},index=[0, 1, 2, 3,4,5,6,7,8,9])

这个想法是根据 df1 的值乘以 df1 and df2.shift(-1)(元素乘法,而不是矩阵乘法)。如果(df1>=0.50 or df1<=-0.50),那么我将 df1 和 df2.shift(-1) 相乘。否则,我就放 0。

本例中的预期结果应如下所示(列名是 df1 的列名以及 df1 索引):

df3=pd.DataFrame({'A': [0,0,0, -0.1212,0.010905,0,0,0, -0.012,'NaN'],'B': [0,0.015,0,-0.00755,0,0,0.00065,0,-0.0045,'NaN']},index=[0, 1, 2, 3,4,5,6,7,8,9])

我尝试了以下代码:

import numpy as np
import pandas as pd
df3=np.where((df1>=0.50 or df1 <=-0.50),df1*df2.shift(-1),0)

我得到了 DataFrame 的真值是不明确的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。 谢谢。

【问题讨论】:

    标签: pandas dataframe multiplication elementwise-operations


    【解决方案1】:

    | 用于按位ORDataFrame 构造函数:

    arr = np.where((df1>=0.50) | (df1 <=-0.50),df1*df2.shift(-1),0)
    df3 = pd.DataFrame(arr, index=df1.index, columns=df1.columns)
    print (df3)
              A        B
    0  0.000000  0.00000
    1  0.000000  0.01500
    2  0.000000  0.00000
    3 -0.121200 -0.00755
    4  0.010905  0.00000
    5  0.000000  0.00000
    6  0.000000  0.00065
    7  0.000000  0.00000
    8 -0.012000 -0.00450
    9       NaN      NaN
    

    Numpy 解决方案应该更快:

    arr2 = np.concatenate([df2.values[1:, ], 
                           np.repeat(np.nan, len(df2.columns))[None, :]])
    
    arr = np.where((df1.values>=0.50) | (df1.values <=-0.50),df1.values*arr2,0)
    df3 = pd.DataFrame(arr, index=df1.index, columns=df1.columns)
    print (df3)
              A        B
    0  0.000000  0.00000
    1  0.000000  0.01500
    2  0.000000  0.00000
    3 -0.121200 -0.00755
    4  0.010905  0.00000
    5  0.000000  0.00000
    6  0.000000  0.00065
    7  0.000000  0.00000
    8 -0.012000 -0.00450
    9       NaN      NaN
    

    【讨论】:

    • 它工作,谢谢你的解释。最后一个:我在真实的数据帧上尝试过,我得到了错误:操作数不能与形状一起广播(3951,1056)(7902,2112)。我在进行计算之前检查了两个数据框的维度,它们都是(3951,1056)。不知道为什么它将第二个数据框的大小增加了一倍。谢谢
    • 可能有不同的索引或列名问题,尝试将df1*df2.shift(-1)更改为df1.values*df2.shift(-1).values
    • 它现在正在处理这个问题。还尝试了使用 numpy 的第二个解决方案,也可以正常工作。谢谢!
    • 第一个解决方案失败。 ValueError: operands could not be broadcast together with shapes (10,2) (10,4) ()
    • 是的。这已经在 cmets 中讨论过了,如果你添加 .values 就可以了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    相关资源
    最近更新 更多