将一个 Pandas DataFrame 的元素放置到另一个 DataFrame 中元素的位置

Fht*_*tsm 3 python dataframe pandas

我有两个 Pandas DataFrame,df1 和 df2。

第一个使用零和一指定元素的“位置”。

第二个指定元素的值,但不指定它们的位置(即,它只是从左到右从 Col1 到 Col4 填充)。

df1 = pd.DataFrame([[1,0,0,0], [1,0,0,1], [0,1,0,1], [0,1,1,1]], columns=['Col1', 'Col2', 'Col3', 'Col4'])
df2 = pd.DataFrame([[1,0,0,0], [0.4,0.6,0,0], [0.8,0.2,0,0], [0.1,0.4,0.5,0]], columns=['Col1', 'Col2', 'Col3', 'Col4'])

df1
  Col1 Col2 Col3 Col4
0    1    0    0    0
1    1    0    0    1
2    0    1    0    1
3    0    1    1    1

df2
  Col1 Col2 Col3 Col4
0    1    0    0    0
1  0.4  0.6    0    0
2  0.8  0.2    0    0
3  0.1  0.4  0.5    0
Run Code Online (Sandbox Code Playgroud)

我想创建第三个 DataFrame df3,它将 df2 中的非零值放置在 df1 中的相应位置。我想从左到右工作,即 df2 的每一行中最左边的非零元素应该放置在 df1 中最左边的位置。

df3 = pd.DataFrame([[1,0,0,0], [0.4,0,0,0.6], [0,0.8,0,0.2], [0,0.1,0.4,0.5]], columns=['Col1', 'Col2', 'Col3', 'Col4'])
    
df3
  Col1 Col2 Col3 Col4
0    1    0    0    0
1  0.4    0    0  0.6
2    0  0.8    0  0.2
3    0  0.1  0.4  0.5
Run Code Online (Sandbox Code Playgroud)

由于真实的 DataFrame 相对较大,因此需要有效的解决方案(即循环遍历元素可能不是一个选择)。

非常感谢您的帮助!

alp*_*ğlu 5

如果您使用 numpy,那么您的问题有一个非常有效的解决方案。有一种名为 place 的方法可以完全满足您的需要。

# get series with right typing
values1 = df1.values.astype(np.float64)
values2 = df2.values.astype(np.float64)
Run Code Online (Sandbox Code Playgroud)
#replace 1 values in the series1 with non zero values from series2
np.place(values1, values1==1, values2[values2 != 0])
Run Code Online (Sandbox Code Playgroud)
# replace values in the dataframe1
df1.loc[:] = values1
Run Code Online (Sandbox Code Playgroud)