如何在python中添加数据帧的列和行作为字典的键和值

时间:2015-10-17 06:22:31

标签: python dictionary

我有一个包含两列的数据框,我基本上想要做的是创建一个字典,其中列名作为键的列和连接行作为值。

以下是包含2列

的示例数据框
X1KS_AH353KBBXX_8_Aspen_F07_X5  X2861_AH353KBBXX_8_Aspen_D08_X5
G   G
N   C
G   G
M   C
G   G
A   A

我能够为1列做到这一点,但我如何制作两列。我尝试循环以及创建一个函数,然后循环它们但没有一个工作

import re
file_in = open("HapMap.filtered.hmp_test.txt")

result = {}
for line in file_in:
    line = line.strip().split()
    line2 = line[1]
    if re.search("Aspen", line2):
        gene = line2
        result[gene] = ""
    else:
        result[gene]+=line2

3 个答案:

答案 0 :(得分:2)

尝试:

import re
file_in = open("HapMap.filtered.hmp_test.txt")

columns = 2
result = {}

for line in file_in:
    line = line.strip().split()
    for column in range(columns):
        line2 = line[column]
        if re.search("Aspen", line2):
            gene = line2
            result[gene] = ""
        else:
            result[gene]+=line2

这会为每列重复您的代码。

答案 1 :(得分:2)

据我了解,您希望将数据框设置为字典,列名为键,该列中的值是否以列表形式显示?

如果是这样,我建议使用pandas模块。

import pandas as pd

df = pd.read_csv('data.csv')#a csv file with data just how you presented it above.
dataDict = pd.DataFrame.to_dict(df, orient='list')#turns the dataframe into a dictionary, with the values presented as a list for each column.

print (dataDict)

这是输出:

{'X2861_AH353KBBXX_8_Aspen_D08_X5': ['G', 'C', 'G', 'C', 'G', 'A'], 'X1KS_AH353KBBXX_8_Aspen_F07_X5': ['G', 'N', 'G', 'M', 'G', 'A']}

答案 2 :(得分:1)

值得一般解决方案的有趣挑战。我将需求解释为值是连接字符串。

#!/usr/bin/env python

import collections as cols
text="""col1 col2 col3
a 1 &
b 2 @
c 3 $
"""
d = cols.OrderedDict()
h = text.splitlines()[0].split(" ") # headers
cH = len(h)
c = 0
for line in text.splitlines():
    for item in line.split(" "):
        if c >= cH: # lines greater than first, the headers, the dict keys
            mod = c % cH
            try:
                d[h[mod]] = d[h[mod]] + item
            except KeyError: # will happen only on first item
                d[h[mod]] = item
        c += 1
print(d)

结果:

OrderedDict([('col1', 'abc'), ('col2', '123'), ('col3', '&@$')])

订购OrderedDict作为输入。如果您更喜欢常规的无序字典,请使用dict()模块中的OrderedDict()构造函数而不是collections