簡體   English   中英

根據兩列的組合過濾 Pandas 數據框

[英]Filter Pandas dataframe based on combination of two columns

假設我有一個數據框,

   a  b
0  1  2
1  2  3
2  4  2
3  4  3

我想過濾數據框,這樣我得到的結果是,

   a  b
0  1  2
3  4  3

即,我希望通過將兩列過濾在一起來組合(1,2)(4,3)

如果我試試這個,

df1 = df[df['a'].isin([1,4]) & df['b'].isin([2,3])]

我得到了整個數據幀,因為(1,3)(4,2)的組合也包含在上述方法中。 但我只需要給定的組合。 我有一個巨大的兩列元組列表,我想根據相應的元組組合過濾數據框。

另外,我不想將兩列合並為一個字符串然后進行過濾。

采用 -

df[df[['a', 'b']].apply(tuple, axis=1).isin([(1,2), (4,3)])]

輸出

    a   b
0   1   2
3   4   3

解釋

df[['a', 'b']].apply(tuple, axis=1)給出一系列元組 -

0    (1, 2)
1    (2, 3)
2    (4, 2)
3    (4, 3)

.isin([(1,2), (4,3)])搜索所需的元組並給出一個布爾系列

@Vivek Kalyanarangan概述的元組比較方法是可行的方法,但在大型數據幀的情況下,通過使用 MultiIndex 而不是使用 apply 函數創建元組可以顯着提高速度:

例如,在您的情況下:

keep_tuples = [(1,2), (4,3)]
tuples_in_df = pd.MultiIndex.from_frame(df[["a","b"]])
df[tuples_in_df.isin(keep_tuples)]

與使用應用函數相比,這導致 1,000,000 X 2 大小的 df 的速度提高了約 5 倍。

另一個想法是將兩列( ab )作為字符串連接起來,並檢查1243 ,即

df[df.astype(str).sum(axis = 1).isin([12, 43])]
#   a  b
#0  1  2
#3  4  3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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