![](/img/trans.png)
[英]Pandas combine dataframes by stacking columns with values on matching condition
[英]Combine/Splice pandas DataFrames with a condition
我有兩個熊貓數據框, 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
做這樣的事情:
C = A.copy()
C.update(B.iloc[X])
您基本上是獲取其中一個數據幀的副本,並更新根據匹配索引過濾的另一個數據幀中的記錄。
如果要將 A 的完整副本保留到 C 中,則可以針對 X 對 A 和 B 進行分區:
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']
pd.DataFrame.combine_first
從第一個數據幀中獲取值並補充第二個。 但是在列表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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.