我有一個包含多索引的數據表。多指數的第一級是與給定序列(DNA)相對應的名稱,多指數的第二級對應於在下面的示例中的特定類型的序列變體wt
,m1
,m2
,m3
。並非所有給出的wt
序列將具有所有類型的變體(參見下面的seqA
和seqC
)。通過要求MultiIndex中存在多個項來過濾熊貓數據框
df = pd.DataFrame(data={'A':range(1,9), 'B':range(1,9), 'C': range(1,9)},
index=pd.MultiIndex.from_tuples([('seqA', 'wt'), ('seqA', 'm1'),
('seqA', 'm2'), ('seqB', 'wt'), ('seqB', 'm1'), ('seqB', 'm2'),
('seqB', 'm3'), ('seqC', 'wt') ]))
df.index.rename(['seq_name','type'], inplace=True)
print df
A B C
seq_name type
seqA wt 1 1 1
m1 2 2 2
m2 3 3 3
seqB wt 4 4 4
m1 5 5 5
m2 6 6 6
m3 7 7 7
seqC wt 8 8 8
欲對數據執行隨後的分析僅具有變體(在本例中m1
和m2
)的特定類型的(一個或多個)的序列。所以我想過濾我的數據幀,要求給定的seq_name
有全部在list
中指定的變體類型。
我目前的解決方案非常笨重,而且不是非常美觀的IMO。
var_l = ['wt', 'm1', 'm2']
df1 = df[df.index.get_level_values('type').isin(var_l)] #Filter varaints not of interest
set_l = []
for v in var_l: #Filter for each variant individually, and store seq_names
df2 = df[df.index.get_level_values('type').isin([v])]
set_l.append(set(df2.index.get_level_values('seq_name')))
seq_s = set.intersection(*set_l) # Get seq_names that only have all three variants
df3 = df1[df1.index.get_level_values('seq_name').isin(seq_s)] #Filter based on seq_name
print df3
A B C
seq_name type
seqA wt 1 1 1
m1 2 2 2
m2 3 3 3
seqB wt 4 4 4
m1 5 5 5
m2 6 6 6
我覺得有必須是一個班輪可以做到這一點。喜歡的東西:
var_l = ['wt', 'm1', 'm2']
filtered_df = filterDataframe(df1, var_l)
print filtered_df
A B C
seq_name type
seqA wt 1 1 1
m1 2 2 2
m2 3 3 3
seqB wt 4 4 4
m1 5 5 5
m2 6 6 6
我試圖尋找這個網站,並且只發現讓你通過在列表過濾任何項目答案。
謝謝!第一個解決方案正是我想要的。我對熊貓比較陌生,並不熟悉'query'或'groupby'功能。 – HikerT