将条件组合/拼接pandas DataFrames

时间:2017-01-12 04:53:08

标签: python pandas dataframe merge conditional

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

我想要实现的目标: 得到的矩阵 C 也具有与 A B 相同的索引和列。对于数据,如果索引位于 X ,则从数据框 A 获取行条目,否则从 B 获取行条目。

我认为会有一种pythonic方法来实现这一点,但它们不会编译。例如,我使用 A 的索引创建 C 数据框,然后尝试以下内容:

C = C.apply(lambda i: A.ix[i.index] if i in X else B.ix[i.index])

我现在有一些工作,我基本上在数学上解决它。所以我基于 X 创建了两个布尔数组,分别指定了我想要的 A B 。然后我将 A B 乘以这些矩阵,然后 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

2 个答案:

答案 0 :(得分:1)

做这样的事情:

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)

答案 1 :(得分:1)

考虑以下数据

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']

pd.DataFrame.combine_first获取第一个数据帧中的值,使用第二个数据帧获取补充值。但是在列表loc上使用x,我将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)