解决Pandas数据框与函数的合并冲突?

Tho*_*wne 6 python pandas

假设我有两个数据帧,我想合并,但是因为行和列重叠而存在冲突.我想传递一个函数来解决冲突,而不是复制行.可以这样做吗?

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
Run Code Online (Sandbox Code Playgroud)

如您所见,两个数据框在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
Run Code Online (Sandbox Code Playgroud)

当我真正想要的是真值来覆盖Falses(或NaN),我可以做,例如,传递"or"函数来解决这种重复冲突.这可以在熊猫中完成吗?

结果应如下所示:

               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
Run Code Online (Sandbox Code Playgroud)

也就是说,在没有重复的情况下,两个数据帧中的值通过,在任一帧中没有数据的情况下,返回NaN,但是在两个帧中都有数据的情况下,True覆盖False(即,"要么").

我正在寻找一种通用的解决方案,用于合并Pandas DataFrames之间的冲突,最好是通过传递函数.

dlo*_*man 3

使用合并而不是使用 concat:

>> pd.merge(df1, df2, on=(df1.columns & df2.columns).tolist(), how='outer', left_index=True, right_index=True)
               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
Run Code Online (Sandbox Code Playgroud)

on=(df1.columns & df2.columns).tolist()参数为您提供了重叠列的列表(在本例中['C','D']

how='outer'两个帧中的键进行并集(SQL:完全外连接)

left_index=True保持right_index=True行索引完整