Pandas:如何获取列的所有值,其中另一列的值是特定值

时间:2018-02-13 13:13:53

标签: python pandas pandas-groupby

我有一个包含sample_id和变异的数据框: 每个样本都包含几个突变

sample_id    mutation
sample1      mutation_A
sample1      mutation_B
sample1      mutation_D

sample2      mutation_C
sample2      mutation_D

sample3      mutation_A
sample3      mutation_B
sample3      mutation_C

我希望能够获得mut_C存在的值。但是我希望得到该样本的所有结果 -

df.loc[(df[mutation] == 'mutation_C')]

返回:

sample_id    mutation
sample2      mutation_C

如何获取其余的sample2突变数据,所以:

sample_id    mutation
sample2      mutation_C
sample2      mutation_D

我一直在尝试使用grouopby,但无法弄清楚如何获得所有结果

2 个答案:

答案 0 :(得分:1)

首先过滤所有samples,然后再按isin过滤:

a = df.loc[df['mutation'] == 'mutation_C', 'sample_id']
df = df[df['sample_id'].isin(a)]
print (a)

3    sample2
7    sample3
Name: sample_id, dtype: object

df = df[df['sample_id'].isin(a)]
print (df)
  sample_id    mutation
3   sample2  mutation_C
4   sample2  mutation_D
5   sample3  mutation_A
6   sample3  mutation_B
7   sample3  mutation_C

答案 1 :(得分:0)

假设您有其他数据,更简洁的想法是按照您的方式设置索引。 (我添加了一个带有df['value'] = 1

的虚拟列
>>> a = df.set_index(['mutation', 'sample_id'])
>>> a.sort_index()
                      value
mutation   sample_id       
mutation_A sample1        1
           sample3        1
mutation_B sample1        1
           sample3        1
mutation_C sample2        1
           sample3        1
mutation_D sample1        1
           sample2        1
>>> a.loc['mutation_C']
               value
sample_id       
sample2        1
sample3        1

如果您确实需要将sample_ids作为列表,那么您可以这样做:

>>> a.loc['mutation_C'].index.tolist()
['sample2', 'sample3']

不是你问过的,但可能是另一个有用的观点:

>>> df.pivot_table(values='value', index='sample_id', columns='mutation')
mutation   mutation_A  mutation_B  mutation_C  mutation_D
sample_id                                                
sample1           1.0         1.0         NaN         1.0
sample2           NaN         NaN         1.0         1.0
sample3           1.0         1.0         1.0         NaN