这是关于How to treat NaN or non aligned values as 1s or 0s in multiplying pandas DataFrames
的后续问题我有以下数据:
df1 = pd.DataFrame({"x":[1, 2, 3, 4, 5],
"y":[3, 4, 5, 6, 7]},
index=['a', 'b', 'c', 'd', 'e'])
df2 = pd.DataFrame({"y":[1, NaN, 3, 4, 5],
"z":[3, 4, 5, 6, 7]},
index=['b', 'c', 'd', 'e', 'f'])
我希望df1
和df2
的乘法与df2
中保留的所有数据相乘,df1中没有相应的条目,df2
中只有行和列
E.g。
print (df1.mul(df2).fillna(df2))
或
print (df1.mul(df2).combine_first(df2))
给出:
x y z
a NaN NaN NaN
b NaN 4.0 3.0
c NaN NaN 4.0
d NaN 18.0 5.0
e NaN 28.0 6.0
f NaN 5.0 7.0
但我想到达:
y z
b 4.0 3.0
c NaN 4.0
d 18.0 5.0
e 28.0 6.0
f 5.0 7.0
注意:
NaN
,Inf
,-Inf
值。答案 0 :(得分:1)
我认为最简单的方法是获取索引和列的交集,如下所示:
In [1142]: c = df1.columns & df2.columns
In [1143]: i = df1.index & df2.index
现在,只需索引并乘以df.loc
:
In [1145]: df2.loc[i, c] *= df1.loc[i, c]; df2
Out[1145]:
y z
b 4.0 3
c NaN 4
d 18.0 5
e 28.0 6
f 5.0 7