将两个数据框相乘,基于列并且跳过行不满足条件
Posted
技术标签:
【中文标题】将两个数据框相乘,基于列并且跳过行不满足条件【英文标题】:Multiply two data frames, base on a columns and skipping rows do not fulfill a condition 【发布时间】:2019-06-29 19:19:07 【问题描述】:我有两个数据框,第一个有两个索引(国家和产品)和相关变量的值。我有 20 个国家和 7 种产品。请注意,我可以在此数据框中有两行具有相同的国家和产品,因为每一行对应于不同的观察。
df1
value
Country Product
Guatemala Hydro 259.420233
Oil 4.211656
Oil 341.550360
Coal, peat and oil shale 4.311316
Coal, peat and oil shale NaN
Hydro 24.433527
Colombia Oil 10
Coal, peat and oil shale 4.311316
.
.
.
第二个数据框与我在下面显示的完全一样
df2
mult
Country Product
Argentina Natural gas 1
Colombia Oil 161
Mexico Coal, peat and oil shale 9
Natural gas 2
我正在尝试将两个数据帧相乘。最终数据帧的行数必须等于第一个数据帧。当 df2 中没有任何可用值与 df1 中的行相乘时(例如危地马拉/石油),df1 中的值必须保持不变。
非常感谢您的帮助。我尝试了很多选择和任何工作。
【问题讨论】:
df1.multiply(df2.rename(columns='mult': 'value'), fill_value=1)
?或许看看下面的问题:***.com/questions/54540704/…。该操作是减法,但变化很小,除了可能想要设置fill_value=1
。你甚至已经在这里有了 MultiIndex...
@ALollz 我收到此错误 TypeError: '
我无法用您提供的数据重现。您的DataFrame
s 之一是否具有NaN
的索引级别?如果是这样,您需要删除该行。在乘法尝试之前:df1 = df1.reindex(df1.index.dropna())
和 df2 相同
【参考方案1】:
首先,对会产生重复的列进行索引并不是一个好主意。如果您真的很想违反该最佳实践,您仍然可以按照我下面的说明,然后将其更改回原始索引。
import pandas as pd
import numpy as np
df1 = df1.reset_index(drop = False)
df2 = df2.reset_index(drop = False)
df3 = df1.merge(df2, on = [‘product’, ‘country’], how = ‘left’)
df3[ ‘result’] = np.where(df3.mult.isnull(), df3.value, df3.value * df3.mult)
#now, disrespect all that is holy
df3 = df3.set_index([‘product’, ‘country])
【讨论】:
以上是关于将两个数据框相乘,基于列并且跳过行不满足条件的主要内容,如果未能解决你的问题,请参考以下文章