【问题标题】:pandas dataframe multiplication by column, with index matched熊猫数据帧按列相乘,索引匹配
【发布时间】:2017-11-21 11:53:19
【问题描述】:
df1=pd.DataFrame(np.random.randn(6,3),index=list("ABCDEF"),columns=list("XYZ"))
df2=pd.DataFrame(np.random.randn(6,1),index=list("ABCDEF"))

我想将 df1 的每一列与 df2 相乘,并按索引标签匹配。这意味着:

df1["X"]*df2
df1["Y"]*df2
df1["Z"]*df2

输出将具有 df1 的索引和列。

我该怎么做?试了好几种方法,还是不行……

【问题讨论】:

    标签: python pandas multiplication


    【解决方案1】:

    使用mul函数和多个DataFrame by Series(列)使用iloc按位置选择:

    print(df1.mul(df2.iloc[:,0], axis=0))
              X         Y         Z
    A -0.577748  0.299258 -0.021782
    B -0.952604  0.024046 -0.276979
    C  0.175287  2.507922  0.597935
    D -0.002698  0.043514 -0.012256
    E -1.598639  0.635508  1.532068
    F  0.196783 -0.234017 -0.111166
    

    详情:

    print(df2.iloc[:, 0])
    A   -2.875274
    B    1.881634
    C    1.369197
    D    1.358094
    E   -0.024610
    F    0.443865
    Name: 0, dtype: float64
    

    【讨论】:

    • 我想对 df1 中的每一列都执行此操作,而不指定列名,并将结果连接到与 df1 共享相同索引和列名的新数据帧中。
    • 这行得通。但这实际上与我尝试的非常接近。我的问题是:为什么我必须使用 df2.iloc[:,0] 而不是 df2?
    • 因为列名不同。如果更改df2=pd.DataFrame(np.random.randn(6,1),index=list("ABCDEF"), columns=['X']) 然后print(df1 * df2) 它只匹配列XX。但是如果需要多个列,则需要列中的Series
    • 如果我有:df2=pd.DataFrame(np.random.randn(6,2),index=list("ABCDEF"),columns=list("JK")) 和我想让 df1*df2 生成一个带有 index=list("ABCDEF") 和hierarchy columns=[["XYZ"],["JK"]]的数据框?@jezrael
    • @edge27 - 你觉得print (pd.concat([df1, df2], axis=1, keys=('a','b'))) 吗?
    【解决方案2】:

    您可以使用apply 将 df1 中的每一列与 df2 相乘。

    df1.apply(lambda x: x * df2[0], axis=0)
    
              X         Y         Z
    A -0.437749  0.515611 -0.870987
    B  0.105674  1.679020 -0.693983
    C  0.055004  0.118673 -0.028035
    D  0.704775 -1.786515 -0.982376
    E  0.109218 -0.021522 -0.188369
    F  1.491816  0.105558 -1.814437
    

    【讨论】:

    • 如果列/行数很大,这将无法很好地扩展。
    • 我原以为它可以随行很好地缩放,因为应用是沿列的?是的,许多列不能很好地扩展,但这是一种不寻常的情况,海报没有说明规模。
    猜你喜欢
    • 2015-10-20
    • 1970-01-01
    • 2021-05-18
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2020-08-30
    相关资源
    最近更新 更多