在保证所有其他列都是标识时,只从CSV文件读取所选列

2024-09-26 22:49:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

^{pr2}$

所以基本上,我将遍历每个文件,只存储initialposorientation的一个值,但存储{}的所有值,并更新连接文件中的表。事实证明这比我想象的要混乱得多。我有以下代码来读取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的一个值(因为它们保持不变),但是{}的所有值都是存储的,这将非常有帮助


Tags: 文件csvposreaderinitialfilerow空格
2条回答

这是一个带有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_cv之后删除除“ratio”之外的所有其他列。看熊猫医生。在

首先用英语表达。在

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

然后,在完成这些操作之后,您需要从每个后续行中读取最后一列,并将其打包到新行的末尾,而忽略其余部分。在

因此,要将其转换为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列结尾,所有这些列都具有相同的“含义”,因此每行不再是真正的值,而是值的集合。在

反规范化通常被认为是不好的,原因有很多。有些情况下,只要你知道你在做非规范化的数据,那么它就更容易或更快地处理,为什么,这可能是一件有用的事情。Wikipedia有一篇很好的关于database normalization的文章,解释了这些问题;您可能想阅读它,以便了解您在这里做什么,并确保它是正确的。在

相关问题 更多 >

    热门问题