【问题标题】:Looking for same values in more than one columns在多列中查找相同的值
【发布时间】:2021-03-23 20:22:07
【问题描述】:

我有一个包含下一个信息的数据框

      Syndromes                                 Genes
0   1p36 microdeletion syndrome     RP11-34P13.7; CICP27; AL627309.1; RP11-34P13.1...
1   Cri du Chat Syndrome            ICMT; LINC00337; HES3; GPR153; ACOT7; RP1-202O...
...

我想知道是否有一些基因涉及多个综合征。

有没有简单的方法可以做到这一点?

【问题讨论】:

  • 我没有得到你的问题。请提供具有预期输出和解释的良好数据样本。

标签: python pandas


【解决方案1】:

IIUC 你想得到基因在各种症状中的出现。

您可以通过第一个explodinggroupby count 来计算特定基因出现的症状。

df1 = df.assign(gene=df['Genes'].str.split('; ')).explode('gene')
df1.groupby('gene')['Syndromes'].count()

gene
ACOT7           1
AL627309.1      1
CICP27          2
GPR153          1
HES3            1
ICMT            1
LINC00337       1
RP1-202O        1
RP11-34P13.1    1
RP11-34P13.7    1
Name:       Syndromes, dtype: int64

如果您想列出症状的名称,请执行以下操作:

df1.groupby('gene')['Syndromes'].apply(list)

gene
ACOT7                                  [1   Cri du Chat Syndrome]
AL627309.1                      [0   1p36 microdeletion syndrome]
CICP27          [0   1p36 microdeletion syndrome, 1   Cri du C...
GPR153                                 [1   Cri du Chat Syndrome]
HES3                                   [1   Cri du Chat Syndrome]
ICMT                                   [1   Cri du Chat Syndrome]
LINC00337                              [1   Cri du Chat Syndrome]
RP1-202O                               [1   Cri du Chat Syndrome]
RP11-34P13.1                    [0   1p36 microdeletion syndrome]
RP11-34P13.7                    [0   1p36 microdeletion syndrome]
Name:       Syndromes, dtype: object

【讨论】:

  • @ManoloDominguezBecerra:使用explode pandas 版本应该是>= 0.25
  • 我正在做一些升级,然后我会告诉你这是否可行。
  • 我已经升级了我的 pandas 并且我有 versionb pandas-1.1.3 但仍然收到错误 AttributeError: 'DataFrame' object has no attribute 'explode'
  • @Pygirl 这是不使用explode, pd.value_counts(np.hstack(df['Genes'].str.split('; ')))的一种方法
  • 完全正确,我重新启动了我的内核,然后它工作了。 Shubhan Sharma 的第二个建议也很有效。谢谢!!
【解决方案2】:

从您的源数据示例中,我发现您实际上只有 2 列:

  • 综合征 - 综合征名称,
  • 基因 - 涉及该综合征的基因名称的列表(分开 与 '; ' 字符串)。

假设您的源 DataFrame 包含:

    Syndromes                                           Genes
0  Syndrome_1    XXX-13.7; XXX-44.2; AL627309.1; RP11-34P13.1
1  Syndrome_2  ICMT; LINC00337; HES3; GPR153; ACOT7; RP1-202O
2  Syndrome_3                        ICMT; XXX-13.7; XXX-22.9
3  Syndrome_4                         XXX-13.7; GPR153; ACOT7
4  Syndrome_5                               XXX-44.2; RP1-202

第一步是转换每个字符串(包含基因列表) 放入一个实际的列表

df.Genes = df.Genes.str.split('; ')

打印此操作前后的源df,看看有什么区别。

然后,查看每个基因涉及哪些综合征,过滤掉单个基因 参与:

  1. 定义一个函数,为一组行生成一个综合症列表:

    def synList(grp):
        if grp.index.size > 1:
            return grp.Syndromes.to_list()
        return np.nan
    
  2. 生成结果:

    result = df.explode(column='Genes').groupby('Genes').apply(synList).dropna()
    

    步骤:

    • df.explode(column='Genes') - 将每一行转换成几行 行,每行都有一个单个基因。
    • groupby('Genes') - 按 Genes 列对上述结果进行分组。
    • apply(synList) - 将上述函数应用到每个组。
    • dropna() - 删除单次出现的行。

对于我的源数据,结果如下系列

Genes
ACOT7                   [Syndrome_2, Syndrome_4]
GPR153                  [Syndrome_2, Syndrome_4]
ICMT                    [Syndrome_2, Syndrome_3]
XXX-13.7    [Syndrome_1, Syndrome_3, Syndrome_4]
XXX-44.2                [Syndrome_1, Syndrome_5]
dtype: object

索引(左列)是基因名称和值(右列, 包含一个列表)是该基因发生的综合征的列表。

【讨论】:

  • 哇,看起来我正在阅读一本包含正确说明的手册。 +1
  • 我写的代码非常简洁,但是对于 PythonPandas 经验不足的人来说阅读它可能会很困难。因此,建议对这种链式指令的每个步骤进行一些解释。
猜你喜欢
  • 2012-06-18
  • 2017-07-24
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 2013-08-01
  • 1970-01-01
相关资源
最近更新 更多