簡體   English   中英

結合/拼接熊貓數據幀與條件

[英]Combine/Splice pandas DataFrames with a condition

我有兩個熊貓數據框, AB
數據框具有相同的索引和列,只是數據不同。 我有一個額外的數組X ,它是索引的子集。

我想要實現的是:生成的矩陣C也具有與AB相同的索引和列。 對於它的數據,如果索引在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 的布爾數組來分別指定我想要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 中,則可以針對 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM