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 相对较大,因此需要有效的解决方案(即循环遍历元素可能不是一个选择)。
非常感谢您的帮助!
如果您使用 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)
| 归档时间: |
|
| 查看次数: |
134 次 |
| 最近记录: |