【发布时间】:2021-03-11 03:43:51
【问题描述】:
假设我有两个数据框,我想合并它们,但由于行和列重叠而存在冲突。我不想复制行,而是想传递一个函数来解决冲突。这个可以吗?
import numpy as np
import pandas as pd
dates1 = pd.date_range("2014-01-01", periods = 4)
dates2 = pd.date_range("2014-01-03", periods = 4)
cols1 = list("ABCD")
cols2 = list("CDEF")
df1 = pd.DataFrame(np.ones([4, 4], dtype = "bool"), index = dates1, columns = cols1)
df2 = pd.DataFrame(np.zeros([4, 4], dtype = "bool"), index = dates2, columns = cols2)
In [317]: df1
Out[317]:
A B C D
2014-01-01 True True True True
2014-01-02 True True True True
2014-01-03 True True True True
2014-01-04 True True True True
In [318]: df2
Out[318]:
C D E F
2014-01-03 False False False False
2014-01-04 False False False False
2014-01-05 False False False False
2014-01-06 False False False False
如您所见,两个数据框在 C 和 D 列以及 2014-01-03 和 2014-01-04 行中重叠。所以现在当我合并它们时,由于这种冲突,我得到了重复的行:
In [321]: pd.concat([df1, df2])
Out[321]:
A B C D E F
2014-01-01 True True True True NaN NaN
2014-01-02 True True True True NaN NaN
2014-01-03 True True True True NaN NaN
2014-01-04 True True True True NaN NaN
2014-01-03 NaN NaN False False False False
2014-01-04 NaN NaN False False False False
2014-01-05 NaN NaN False False False False
2014-01-06 NaN NaN False False False False
当我真正想要的是 True 值来覆盖 False(或 NaN)时,我可以这样做,例如,通过传递“或”函数来解决此类重复冲突。这可以在 Pandas 中完成吗?
结果应该是这样的:
A B C D E F
2014-01-01 True True True True NaN NaN
2014-01-02 True True True True NaN NaN
2014-01-03 True True True True False False
2014-01-04 True True True True False False
2014-01-05 NaN NaN False False False False
2014-01-06 NaN NaN False False False False
即在没有重复的情况下,两个数据帧中的值通过,在任何一个帧都没有数据的情况下,返回一个NaN,但是在两个帧都有数据的情况下,True覆盖了False(即是,“或”)。
我正在寻找一种在合并 Pandas DataFrame 时在冲突之间进行套利的通用解决方案,最好是通过传递函数。
【问题讨论】: