【问题标题】:Having a panda data frame, output specific columns after condition拥有熊猫数据框,条件后输出特定列
【发布时间】:2020-04-03 14:21:18
【问题描述】:

我有一个熊猫数据框,其中第一列包含细菌基因组(名称)。另一方面,我有一本字典,其中的键中有未知的细菌名称,值中有我知道的细菌,这些值在我的数据框中。

我想创建一个新的数据框,其中一列中包含未知名称,然后是第二列中的已知名称以及前一个数据框的某些列。最好看例子。

我的朋友

accession                  phylum           class       order          genus
1   bacteriaA   p__Firmicutes   c__Bacilli  o__Lactobacillales  g__Enterococcus
2   BacteriaB   p__Proteobacteria   c__Gammaproteobacteria  o__Pseudomonadales  g__Acinetobacter

我的字典

{'GCF_001999625.1': ['bacteriaA'],
 'GCA_000307585.2': ['BacteriaC', 'BacteriaJ', 'BacteriaK'],
 'GCA_000404785.1': ['BacteriaB','BacteriaBP']}


我怎么能创造出这样的东西

unknown              accession.       phylum            class       order          genus
1   GCF_001999625.1 bacteriaA p__Firmicutes c__Bacilli  o__Lactobacillales  g__Enterococcus
2   GCA_000404785.1 BacteriaB p__Proteobacteria c__Gammaproteobacteria  o__Pseudomonadales  g__Acinetobacter

基本上,我不走运的是引入查询并以可理解的方式获得 4 列作为输出。

从生物学上讲,我想将我未知的细菌群与我的已知群建立关系。

我已经花了很多时间尝试这个,但我不知道该怎么做。

你能给我一些建议吗?

【问题讨论】:

  • 每一种已知细菌都只有一种未知细菌吗?
  • 我会说是的

标签: python pandas dataframe


【解决方案1】:

我会先将 dict 转换为包含 2 列的 DataFrame:未知名称和 Bacteria,然后将内部合并到初始 DataFrame 中:

data = {'GCF_001999625.1': ['bacteriaA'],
 'GCA_000307585.2': ['BacteriaC', 'BacteriaJ', 'BacteriaK'],
 'GCA_000404785.1': ['BacteriaB','BacteriaBP']}

unk = pd.DataFrame([[k,j] for k, v in data.items() for j in v],
                   columns = ['unknown', 'accession'])

resul = unk.merge(df, on='accession')

resul 符合预期:

           unknown  accession             phylum                   class               order             genus
0  GCF_001999625.1  bacteriaA      p__Firmicutes              c__Bacilli  o__Lactobacillales   g__Enterococcus
1  GCA_000404785.1  BacteriaB  p__Proteobacteria  c__Gammaproteobacteria  o__Pseudomonadales  g__Acinetobacter

【讨论】:

    【解决方案2】:

    如果每个已知细菌只有一个未知细菌,你应该反转你的字典——将已知细菌作为键,将未知细菌作为值:

    {'bacteriaA': 'GCF_001999625.1',
    'BacteriaC': 'GCA_000307585.2',
    'BacteriaJ': 'GCA_000307585.2',
    'BacteriaK': 'GCA_000307585.2',
    'BacteriaB': 'GCA_000404785.1'
    'BacteriaBP': 'GCA_000404785.1'}
    

    你可以这样做:

    original_dict = {'GCF_001999625.1': ['bacteriaA'],
                     'GCA_000307585.2': ['BacteriaC', 'BacteriaJ', 'BacteriaK'],
                     'GCA_000404785.1': ['BacteriaB','BacteriaBP']}
    new_dict = {}
    for unknown_bacteria, known_bacteria_list in original_dict.items():
        for known_bacteria in known_bacteria_list:
            new_dict[known_bacteria] = unknown_bacteria
    

    然后你可以简单地使用 pandas 替换功能:

    df["unknown"] = df["accession"].replace(new_dict)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-20
      • 2015-06-28
      • 2020-04-23
      相关资源
      最近更新 更多