【发布时间】:2017-08-09 13:27:41
【问题描述】:
我有一个带有多索引的数据表。多索引的第一级是与给定序列(DNA)对应的名称,多索引的第二级对应于特定类型的序列变体wt,m1,m2,@987654324 @ 在下面的示例中。并非所有给定的wt 序列都会具有所有类型的变体(请参阅下面的seqA 和seqC)。
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
我已尝试搜索此站点,但只找到了可让您按列表中的任何项进行过滤的答案。
【问题讨论】:
标签: python pandas multi-index