Python 结合/拼接具有条件的数据帧

Python 结合/拼接具有条件的数据帧,python,pandas,dataframe,merge,conditional,Python,Pandas,Dataframe,Merge,Conditional,我有两个数据帧,A和B 数据帧具有相同的索引和列,只是数据不同。 我还有一个额外的数组X,它是索引的子集 我想要达到的目标: 生成的矩阵C,其索引和列也与A和B相同。对于其数据,如果索引位于X中,则从数据帧A获取行条目,否则从B获取行条目 我以为会有一个python的方法来实现这一点,但他们没有编译。例如,我用a的索引创建了一个C数据框,然后尝试了以下方法: C = C.apply(lambda i: A.ix[i.index] if i in X else B.ix[i.index]) 我现

我有两个数据帧,AB
数据帧具有相同的索引和列,只是数据不同。 我还有一个额外的数组X,它是索引的子集

我想要达到的目标: 生成的矩阵C,其索引和列也与AB相同。对于其数据,如果索引位于X中,则从数据帧A获取行条目,否则从B获取行条目

我以为会有一个python的方法来实现这一点,但他们没有编译。例如,我用a的索引创建了一个C数据框,然后尝试了以下方法:

C = C.apply(lambda i: A.ix[i.index] if i in X else B.ix[i.index])
我现在有些东西在工作,我基本上是用数学方法解决的。因此,我基于X创建了两个布尔数组,分别指定我希望从AB中获得哪些条目。然后我用这些矩阵乘以AB,然后做C=A+B。这似乎是一个冗长的问题。我想要的是更简短、可读性更强的东西。我当前的解决方案如下所示:

def testIn(row):
    return [x in X for x in row.index]
def testOut(row):
    return [x not in X for x in row.index]

AMAP = C.apply(testIn, axis=0)
BMAP = C.apply(testOut, axis=0)

ANEW = pandas.DataFrame(AMAP*A)
BNEW = pandas.DataFrame(BMAP*B)

C = ANEW + BNEW

这样做:

C = A.copy()
C.update(B.iloc[X])
基本上,您可以获取一个数据帧的副本,并根据匹配的索引从另一个数据帧更新记录

如果要将A的完整副本保留到C中,可以将A和B分区到X中:

C = A[~A.index.isin(X)]
C = C.append(B.iloc[X]).reindex(A.index)

考虑以下数据

B = pd.DataFrame(np.zeros((6, 6)), list('ABCDEF'), list('abcdef'))
A = pd.DataFrame(np.ones((6, 6)), B.index, B.columns)
x = ['A', 'D']
从第一个数据帧中获取值,并用第二个数据帧进行补充。但是在列表
x
上使用
loc
,我将
A
限制为我想要的行,并合并
B
的其余部分

C = A.loc[x].combine_first(B)

print(C)

     a    b    c    d    e    f
A  1.0  1.0  1.0  1.0  1.0  1.0
B  0.0  0.0  0.0  0.0  0.0  0.0
C  0.0  0.0  0.0  0.0  0.0  0.0
D  1.0  1.0  1.0  1.0  1.0  1.0
E  0.0  0.0  0.0  0.0  0.0  0.0
F  0.0  0.0  0.0  0.0  0.0  0.0
其他备选方案




当然更新了!非常感谢。我曾在其他地方使用过它,但在这里忽略了它作为解决方案。
A.query('index in @x').combine_first(B)
B.drop(x).append(A.loc[x]).reindex_like(A)