在计算结果中仅保留选定DF的列行

时间:2017-08-07 04:14:38

标签: python pandas dataframe

这是关于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'])

我希望df1df2的乘法与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

注意:

  • 可以有合法的NaNInf-Inf值。
  • 列/行可能并不总是位于生成的DF的左侧或右侧/顶部或底部,但在上例中就是这种情况。

1 个答案:

答案 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