如何在乘法pandas DataFrames

时间:2017-08-06 16:08:40

标签: python pandas dataframe indexing missing-data

我想将非对齐或缺失(NaN,Inf,-Inf)值视为1或0。

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
    x     y   z
a NaN   NaN NaN
b NaN   4.0 NaN
c NaN   NaN NaN
d NaN  18.0 NaN
e NaN  28.0 NaN
f NaN   NaN NaN

我想忽略NaN,并且在左侧或右侧DF或两者中将非对齐值视为1。

E.g。

案例1:将df1中缺失或未对齐的值替换为1

df1 * df2
    x     y   z
a   1     3 NaN
b   2   4.0 NaN
c   3     5 NaN
d   4  18.0 NaN
e   5  28.0 NaN
f NaN   NaN NaN

案例2:将df2中缺失或未对齐的值替换为1

df1 * df2
    x     y   z
a NaN   NaN NaN
b NaN   4.0   3
c NaN   NaN   4
d NaN  18.0   5
e NaN  28.0   6
f NaN     5   7

案例3:如果另一个DF中有值,则将任何缺失或未对齐的值替换为1.

df1 * df2
    x     y   z
a   1     3 NaN
b   2   4.0   3
c   3     5   4
d   4  18.0   5
e   5  28.0   6
f NaN     5   7

对于addison,我想将缺失或未对齐的值视为0。

2 个答案:

答案 0 :(得分:3)

我认为在解决方案12DataFrame.mulfillna需要combine_first

print (df1.mul(df2).fillna(df1))
     x     y   z
a  1.0   3.0 NaN
b  2.0   4.0 NaN
c  3.0   5.0 NaN
d  4.0  18.0 NaN
e  5.0  28.0 NaN
f  NaN   NaN NaN

print (df1.mul(df2).combine_first(df1))
     x     y   z
a  1.0   3.0 NaN
b  2.0   4.0 NaN
c  3.0   5.0 NaN
d  4.0  18.0 NaN
e  5.0  28.0 NaN
f  NaN   NaN NaN
print (df1.mul(df2).fillna(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

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

DataFrame.mul fill_value=1输出3的{​​{1}}解决方案:

print (df1.mul(df2, fill_value=1))
     x     y    z
a  1.0   3.0  NaN
b  2.0   4.0  3.0
c  3.0   5.0  4.0
d  4.0  18.0  5.0
e  5.0  28.0  6.0
f  NaN   5.0  7.0

答案 1 :(得分:1)

案例1 用1

替换df1中的缺失或未对齐值
>>> df1.reindex(index=df1.index.union(df2.index), 
                columns=df1.columns.union(df2.columns)).fillna(1)
   x  y  z
a  1  3  1
b  2  4  1
c  3  5  1
d  4  6  1
e  5  7  1
f  1  1  1

如果需要,请在.mul(df2)附加上面的代码段。

案例2 使用1

替换df2中的缺失或未对齐值
>>> df2.reindex(index=df2.index.union(df1.index), 
                columns=df2.columns.union(df1.columns)).fillna(1)
   x  y  z
a  1  1  1
b  1  1  3
c  1  1  4
d  1  3  5
e  1  4  6
f  1  5  7

如果需要,请在.mul(df1)附加上面的代码段。

案例3 如果另一个DF中有值,则将任何缺失或未对齐的值替换为1.

>>> df1.mul(df2).combine_first(df1).combine_first(df2)
    x   y   z
a   1   3 NaN
b   2   4   3
c   3   5   4
d   4  18   5
e   5  28   6
f NaN   5   7