从多个 "Counter" 集合对象构建一个 pandas 数据框

Build a pandas Dataframe from multiple "Counter" Collection objects

我正在处理 DNA 序列数据,我想计算数据集中每个序列上每个字母 (A、C、G、T) 的频率。

为此,我使用 Collections 包中的 Counter 方法尝试了以下方法,并取得了良好的效果:

df = []
for seq in pseudomona.sequence_DNA:
    df.append(Counter(seq))

[Counter({'C': 2156779, 'A': 1091782, 'G': 2143630, 'T': 1090617}),
 Counter({'T': 1050880, 'G': 2083283, 'C': 2101448, 'A': 1055877}),
 Counter({'C': 2180966, 'A': 1111267, 'G': 2176873, 'T': 1108010}),
 Counter({'C': 2196325, 'G': 2204478, 'A': 1128017, 'T': 1123038}),
 Counter({'T': 1117153, 'C': 2176409, 'A': 1115003, 'G': 2194606}),
 Counter({'G': 2054304, 'A': 1026830, 'T': 1044090, 'C': 2020029})]

但是,我确实获得了 Counter 实例的列表(抱歉,如果这不是正确的术语)并且我想要一个具有这些频率的排序数据框,例如:

A C G T
2237 4415 124 324
4565 8567 3776 623

我试图将其转换为列表列表,但后来我不知道如何将其转换为 pandas 数据框:

[list(items.items()) for items in df]

[[('C', 2156779), ('A', 1091782), ('G', 2143630), ('T', 1090617)],
 [('T', 1050880), ('G', 2083283), ('C', 2101448), ('A', 1055877)],
 [('C', 2180966), ('A', 1111267), ('G', 2176873), ('T', 1108010)],
 [('C', 2196325), ('G', 2204478), ('A', 1128017), ('T', 1123038)],
 [('T', 1117153), ('C', 2176409), ('A', 1115003), ('G', 2194606)],
 [('G', 2054304), ('A', 1026830), ('T', 1044090), ('C', 2020029)]]

这可能是愚蠢的事情,但我不知道如何正确地做到这一点。希望有人有正确的线索! :)

将每个做成一个系列,并使用 pd.concataxis,然后转置:

df = pd.concat([pd.Series(c) for c in l], axis=1).T

输出:

>>> df
         C        A        G        T
0  2156779  1091782  2143630  1090617
1  2101448  1055877  2083283  1050880
2  2180966  1111267  2176873  1108010
3  2196325  1128017  2204478  1123038
4  2176409  1115003  2194606  1117153
5  2020029  1026830  2054304  1044090

Counter 的使用方式与 dict 的列表与 DataFrame.from_records 的使用方式相同:

df = pd.DataFrame.from_records(lst)

df:

         C        A        G        T
0  2156779  1091782  2143630  1090617
1  2101448  1055877  2083283  1050880
2  2180966  1111267  2176873  1108010
3  2196325  1128017  2204478  1123038
4  2176409  1115003  2194606  1117153
5  2020029  1026830  2054304  1044090

columns如果有extra/missing键可以指定and/or指定顺序:

df = pd.DataFrame.from_records(lst, columns=['A', 'C', 'G', 'T'])

df:

         A        C        G        T
0  1091782  2156779  2143630  1090617
1  1055877  2101448  2083283  1050880
2  1111267  2180966  2176873  1108010
3  1128017  2196325  2204478  1123038
4  1115003  2176409  2194606  1117153
5  1026830  2020029  2054304  1044090

设置:

from collections import Counter

import pandas as pd

lst = [Counter({'C': 2156779, 'A': 1091782, 'G': 2143630, 'T': 1090617}),
       Counter({'T': 1050880, 'G': 2083283, 'C': 2101448, 'A': 1055877}),
       Counter({'C': 2180966, 'A': 1111267, 'G': 2176873, 'T': 1108010}),
       Counter({'C': 2196325, 'G': 2204478, 'A': 1128017, 'T': 1123038}),
       Counter({'T': 1117153, 'C': 2176409, 'A': 1115003, 'G': 2194606}),
       Counter({'G': 2054304, 'A': 1026830, 'T': 1044090, 'C': 2020029})]