使用字典映射 CSV 标头

Posted

技术标签:

【中文标题】使用字典映射 CSV 标头【英文标题】:Mapping CSV Header using a Dictionary 【发布时间】:2017-06-01 12:34:14 【问题描述】:

我有一个如下所示的参考文件:

Experiment,Array,Drug
8983,Genechip,Famotidine
8878,Microarray,Dicyclomine
8988,Genechip,Etidronate
8981,Microarray,Flunarizine

我使用以下方法成功创建了一个字典,将Experiment 数字映射到Drug 名称:

reader = csv.reader(open('C:\Users\Troy\Documents\ExPSRef.txt'))
#Configure dictionary
result = 
for row in reader:
    key = row[0]
    result[key] = row[2]
di = result

我想将此字典映射到另一个包含实验编号的文件的标题。目前看起来是这样的:

Gene,8988,8981,8878,8983
Vcp,0.011,-0.018,-0.032,-0.034
Ube2d2,0.034,0.225,-0.402,0.418
Becn1,0.145,-0.108,-0.421,-0.048
Lypla2,-0.146,-0.026,-0.101,-0.011

但它应该是这样的:

Gene,Etidronate,Flunarizine,Dicyclomine,Famotidine
Vcp,0.011,-0.018,-0.032,-0.034
Ube2d2,0.034,0.225,-0.402,0.418
Becn1,0.145,-0.108,-0.421,-0.048
Lypla2,-0.146,-0.026,-0.101,-0.011

我尝试使用:

import csv
import pandas as pd

reader = csv.reader(open('C:\Users\Troy\Documents\ExPSRef.txt'))
result = 
    for row in reader:
    key = row[0]
    result[key] = row[2]
    di = result
df = pd.read_csv('C:\Users\Troy\Documents\ExPS2.txt')
df['row[0]'].replace(di, inplace=True)

但它返回了KeyError: 'row[0]'

我也尝试了以下方法,甚至转置以合并:

import pandas as pd

df1 = pd.read_csv('C:\Users\Troy\Documents\ExPS2.txt',).transpose()
df2 = pd.read_csv('C:\Users\Troy\Documents\ExPSRef.txt', delimiter=',', engine='python')
df3 = df1.merge(df2)
df4 = df3.set_index('Drug').drop(['Experiment', 'Array'], axis=1)
df4.index.name = 'Drug'
print df4

这次收到了MergeError('No common columns to perform merge on')

有没有更简单的方法可以将我的字典映射到可行的标题?

【问题讨论】:

您能否显示您尝试替换标题时使用的代码,而不仅仅是一行 嘿@Navidad20,我在上面编辑了它 【参考方案1】:

要记住的一件事是确保与映射器字典对应的keys 以及它映射到的标头具有相同的数据类型。

这里,一个是字符串,另一个是整数类型。因此,在读取自身时,我们将通过将其设置为 str 以供参考 DF 来让它不解释 dtype

df1 = pd.read_csv('C:\Users\Troy\Documents\ExPS2.txt')               # Original
df2 = pd.read_csv('C:\Users\Troy\Documents\ExPSRef.txt', dtype=str)  # Reference

将原始DF 的列转换为其系列表示,然后用从参考中检索到的新药物名称替换旧的实验编号DF

df1.columns = df1.columns.to_series().replace(df2.set_index('Experiment').Drug)
df1

【讨论】:

【参考方案2】:

我在整个脚本中使用了csv。这会修复您想要的标题并保存到一个新文件中。如果您愿意,可以用相同的文件名替换新文件名。本程序是用python3编写的。

import csv 

with open('sample.txt', 'r') as ref:
    reader = csv.reader(ref)
    # skip header line
    next(reader)
    # make dictionary
    di = dict([(row[0], row[2]) for row in reader])

data = []
with open('sample1.txt', 'r') as df:
    reader = csv.reader(df)
    header = next(reader)
    new_header = [header[0]] + [di[i] for i in header if i in di]
    data = list(reader)

# used to make new file, can also replace with the same file name
with open('new_sample1.txt', 'w') as df_new:
    writer = csv.writer(df_new)
    writer.writerow(new_header)
    writer.writerows(data)

【讨论】:

我能够成功地使用@Nickil Maveli 的脚本来单独使用熊猫。不过,这与 csv 脚本一样有效。谢谢!!

以上是关于使用字典映射 CSV 标头的主要内容,如果未能解决你的问题,请参考以下文章

未指定标头映射,无法按名称访问记录值(Apache Commons CSV)

CSVHelper 使用每个文件上的多个映射解析多个 CSV

如何使用标头映射在python中编写元组列表

如何将CSV文件转换为python字典

从两个熊猫系列(csv的列作为DataFrame)创建元素字典

有标头时请求映射不起作用