从多个 "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.concat
和 axis
,然后转置:
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})]
我正在处理 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.concat
和 axis
,然后转置:
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})]