【问题标题】:Multiplying 2 Pandas Dataframes with different numbers of columns将 2 个具有不同列数的 Pandas 数据框相乘
【发布时间】:2021-09-15 05:21:22
【问题描述】:

我有 2 个具有不同列数的 pandas 数据框。 df1 包含 40 行 x 23320 列,而 df2 包含 40 行 x 1 列。 df1 的所有列都必须乘以 df2。但我的结果只包含 NaN 值或未更改的 df1 (取决于我正在尝试的内容)。 我没有收到错误。这是python 2.7,我必须使用它。

这是 2 个数据帧的图片。

我尝试了以下代码:

hnklnTnk = df7.mul(lndf)

hnklnTnk = df7 * lndf

我怀疑 dfs 可能有问题,因为如果我尝试 df7.round(2),它会保持不变。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我找不到关于 python 2.7 的最新版 pandas 的文档,但如果你有一个转换函数,这应该可以工作:df2.transform(lambda x: x * df1.values)

    两个 DF 的完整示例:一个具有多列,另一个具有单列。两者的行数相同:

    df1 = pd.DataFrame([10,20,30,40,50,60,70,80,90,100])
    df2 = pd.DataFrame({
        'col1': [.1,.20,.30,.40,.50,.60,.70,.80,.90,1],
        'col2': [1,2,3,4,5,6,7,8,9,10],
        'col3': [10,20,30,40,50,60,70,80,90,100]
    })
    
    df2 = df2.transform(lambda x: x * df1.values)
    

    pd.DataFrame.transform 上的文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.transform.html

    【讨论】:

    • 我尝试实现您的代码:hnklnTnk = df7.transform(lambda x: x * lndf.values)。但我收到以下错误:异常:('数据必须是一维',你'发生在索引 427005')
    • “一维”错误可能意味着 lndf 不是单列值系列。如果是这样,也许df2.transform(lambda x: x * df1['name_of_column'].values) 可以解决问题。
    • 另外:您是否尝试过运行我的示例代码来查看它是否有效?从未在 python 2.7 上尝试过 pandas,所以总是有一些不匹配的变化。我自己在 python 3.8.5 上测试了 sn-p 并且按预期工作
    • 我能够解决这样的:DF8 = df7.mul([3.349026509,2.368197256,1.882689441,1.55726704,1.312144582,1.115434288,0.951131237,0.810052638,0.686438682,0.576437787,0.477346884,0.387195787,0.304504072, 0.228131093,0.157179357,0.090929971,0.02879819,-0.029698016,-0.084960695,-0.137328681,-0.18709019,-0.234492429,-0.279749021,-0.323045826,-0.364545557,-0.404391466,-0.44271033,-0.479614887,-0.515205832,-0.549573476,-0.582799123, -0.614956235,-0.646111403,-0.676325181,-0.705652796,-0.734144752,-0.761847355,-0.788803165,-0.815051391,-0.840628233],轴=0)
    • 我不能使用一个数据框,这很烦人,但至少可以。
    【解决方案2】:
    df1.multiply(df2.values, axis=1)
    

    或尝试:

    df = pd.DataFrame(df1.values * df2.values, columns=df2.columns)
    

    【讨论】:

    • 如果我尝试这段代码,我会得到以下信息: ValueError: Unable to coerce to DataFrame, shape must be (40, 23320): given (40L, 1L)
    • 您是否尝试过 df1 和 df2 的反相:df2.multiply(df1.values, axis=1)
    • 是的,我有。同样的错误。
    • @neihilrach 没有axis=1 怎么办? df7.mul(indf.values)
    • 也试过了。也尝试过axis = 0。两者都没有工作。我仍然怀疑较大的 df 的小数会造成麻烦,因为我无法将它们四舍五入。我可以四舍五入的较小 df 的小数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多