[英]How to filter and group pandas DataFrame to get count for combination of two columns
[英]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 倍。
另一個想法是將兩列( a
和b
)作為字符串連接起來,並檢查12
和43
,即
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.