我有两个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
答案 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)