[英]How to subset pandas dataframe by two-column list of any length
我嘗試了布爾數組和.isin構造的不同組合,但是我的pandas fu不夠強大。
如果我有以下示例數據框:
In[1]: import pandas as pd
exampledf = pd.DataFrame({ 'factor1' : ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'],
'factor2' : ['e', 'e', 'e', 'e', 'f', 'f', 'f', 'f'],
'numeric' : [1., 2., 3., 4., 5., 6., 7., 8.] })
我需要傳遞任意長度的factor1,factor2對的列表,以返回具有該因子組合的數據框的子集。
例如:
In[2]: def factorfilter(df, factorlist):
# code goes here
# returns a dataframe
factorfilter(exampledf, [['a', 'e'], ['c', 'f']])
Out[2]: factor1 factor2 numeric
0 a e 1
6 f f 7
(如果有比列表更好的設置方法,我全都聽着,這就是發生在我身上的,很容易生成並傳遞給函數)。
您可以利用多索引(索引超過一列)。 我想到了從示例模式構建索引的兩種方法。
import pandas as pd
index = pd.MultiIndex.from_product([list('abcd'),list('ef')],
names=['factor1','factor2'])
要么
factor1 = list('abcdabcd')
factor2 = list('eeeeffff')
index = pd.MultIndex.from_tuples(list(zip(factor1, factor2)),
names=['factor1', 'factor2'])
由此,您可以通過以下方式創建多索引DataFrame :
numerics = list(range(1,9))
df = pd.DataFrame({'numeric': numerics}, index=index)
df輸出
numeric
factor1 factor2
a e 1
f 2
b e 3
f 4
c e 5
f 6
d e 7
f 8
[8 rows x 1 columns]
然后,您可以通過將元組列表傳遞給ix屬性來檢索索引的子集。
subdf = df.ix[[('a','e'), ('c','f')]]
subdf輸出
numeric
factor1 factor2
a e 1
c f 6
[2 rows x 1 columns]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.