当所有其他列保证相同时,仅从CSV文件读取所选列

时间:2014-09-17 23:56:41

标签: python csv file-format

我有一堆CSV文件,我试图连接成一个单独的csv文件。 CSV文件由单个空格分隔,如下所示:

'initial', 'pos', 'orientation', 'ratio'
'chr', '106681', '+', '0.06'
'chr', '106681', '+', '0.88'
'chr', '106681', '+', '0.01'
'chr', '106681', '+', '0.02'

如您所见,除ratio外,所有值都相同。我创建的连接文件将如下所示:

'filename','initial', 'pos', 'orientation', 'ratio1','ratio2','ratio3'
'jon' , 'chr', '106681', '+', '0.06' , '0.88' ,'0.01'

所以基本上,不好迭代每个文件,只存储initialposorientation的一个值,但只存储ratio的所有值并更新连接文件中的表。事实证明这比我更令人困惑。我有以下代码来读取csv文件:

concatenated_file  = open('josh.csv', "rb")
reader = csv.reader(concatenated_file)

for row in reader:
    print row

给出:

['chrom', 'pos', 'strand', 'meth_ratio']
['chr2', '106681786', '+', '0.06']
['chr2', '106681796', '+', '0.88']
['chr2', '106681830', '+', '0.01']
['chr2', '106681842', '+', '0.02']

如果有人可以告诉我如何仅存储initialposorientation的一个值(因为它们保持相同),但是所有的值都是非常有用的ratio

2 个答案:

答案 0 :(得分:1)

首先用英语表达。

你必须从某个地方读取所有其他字段,所以它也可能来自第一行。

然后,完成此操作后,您需要读取每个后续​​行的最后一列并将其打包到新行的末尾,而忽略其余行。

所以,把它变成Python:

with open(outpath, 'wb') as outfile:
    writer = csv.writer(outfile)
    for inpath in paths:
        with open(inpath, 'rb') as infile:
            reader = csv.reader(infile)

            # Read all values (including the ratio) from first row
            new_row = next(reader)

            # For every subsequent row...
            for row in reader:
                # ... read the ratio, pack it on, ignore the rest
                new_row.append(row[-1])

            writer.writerow(new_row)

我不确定评论实际上是否添加任何内容;我认为我的Python比我的英语更容易理解。 :)


值得知道你在这里尝试做的事情被称为“非规范化”。据我所知,你的数据每行最后会有ratio个任意列,所有这些列都具有相同的“含义”,所以每行不再是一个值,而是一个集合值。

由于各种原因,非规范化通常被认为是不好的。有些情况下,非规范化数据更容易或更快地使用 - 只要您知道自己正在使用它,为什么,这可能是一件有用的事情。维基百科有一篇关于database normalization的好文章解释了这些问题;你可能想要阅读它,这样你才能理解你在这里所做的事情,并确保这是正确的。

答案 1 :(得分:1)

这是一个pandas.read_csv()的单行。我们甚至可以放弃引用:

import pandas as pd

csva = pd.read_csv('a.csv', header=0, quotechar="'", delim_whitespace=True)

csva['ratio']
0    0.06
1    0.88
2    0.01
3    0.02
Name: ratio, dtype: float64

有几点:

  • 实际上你的分隔符是逗号+空格。从这个意义上讲,它不是普通的CSV。请参阅"How to make separator in read_csv more flexible?"
  • 请注意,我们通过设置quotechar="'"
  • 删除了对数字字段的引用
  • 如果你真的坚持要保存内存(不要),那么在执行read_csv之后,你可以删除csva的所有其他列而不是'ratio'。请参阅pandas doc。