如何使用 pandas.read_csv 将 CSV 文件中的数据插入数据框?

Posted

技术标签:

【中文标题】如何使用 pandas.read_csv 将 CSV 文件中的数据插入数据框?【英文标题】:How can I insert data from a CSV file into a dataframe using pandas.read_csv? 【发布时间】:2016-07-07 00:58:31 【问题描述】:

我有一个 csv 文件,例如:

"B/G/213","B/C/208","WW_cis",,
"B/U/215","B/A/206","WW_cis",,
"B/C/214","B/G/207","WW_cis",,
"B/G/217","B/C/204","WW_cis",,
"B/A/216","B/U/205","WW_cis",,
"B/C/219","B/G/202","WW_cis",,
"B/U/218","B/A/203","WW_cis",,
"B/G/201","B/C/220","WW_cis",,
"B/A/203","B/U/218","WW_cis",,

我想将它读入数组或数据框之类的东西,这样我就可以将一列中的元素与另一列中的选定元素进行比较。起初,我使用numpy.genfromtxt 将它直接读入了一个数组,但我在'"B/A/203"' 之类的地方到处都带有额外的引号"。我在某处读到,pandas 允许剥离额外的 " 字符串,所以我尝试了:

class StructureReader(object):
    def __init__(self, filename):
        self.filename=filename
    def read(self):
        self.data=pd.read_csv(StringIO(str("RNA/"+self.filename)), header=None, sep = ",")
        self.data

但我得到了类似的东西:

<class 'pandas.core.frame.DataFrame'> 0 0 RNA/4v6p.csv

如何将我的 CSV 文件转换为某种允许我搜索列和行的数据类型?

【问题讨论】:

No such thing as a stupid question。忍不住了,哈哈。 我的评论现在似乎很刻薄......原来的问题在叙述中有所体现。我的意思是鼓励 OP 对知识的追求。 【参考方案1】:

数据插入

您将文件名的字符串放入您的DataFrame,即RNA/4v6p.csv 是您在位置row 0, col 0 中的数据。您需要读入文件并存储数据。这可以通过在您的班级中删除 StringIO(str(...)) 来完成

class StructureReader(object):
    def __init__(self, filename):
        self.filename = filename
    def read(self):
        self.data = pd.read_csv("RNA/"+self.filename), header=None, sep = ",")
        self.data

代码结构批判

我还建议将父目录从 硬编码 中删除

    总是传入完整的文件路径

    class StructureReader(object):
        def __init__(self, filepath):
            self.filepath = filepath
        def read(self):
            self.data = pd.read_csv(self.filepath), header=None, sep = ",")
            self.data
    

    使目录成为__init__() 参数

    class StructureReader(object):
        def __init__(self, directory, filename):
            self.directory = directory
            self.filename = filename
        def read(self):
            self.data=pd.read_csv(self.directory+"/"+self.filename), header=None, sep = ",")
            # or import os and self.data=pd.read_csv(os.path.join(self.directory, self.filename)), header=None, sep = ",")
            self.data
    

    使目录成为常量属性

    class StructureReader(object):
        def __init__(self, filename):
            self.directory = "RNA"
            self.filename = filename
        def read(self):
            self.data = pd.read_csv(self.directory+"/"+self.filename), header=None, sep = ",")
            # or import os and self.data=pd.read_csv(os.path.join(self.directory, self.filename)), header=None, sep = ",")
            self.data
    

这与阅读您的数据无关,只是关于构建代码的最佳实践评论(只是我的$0.02)。

【讨论】:

【参考方案2】:

IIUC,您可以阅读:

df = pd.read_csv('yourfile.csv', header=None)

对我来说返回:

         0        1       2   3   4
0  B/G/213  B/C/208  WW_cis NaN NaN
1  B/U/215  B/A/206  WW_cis NaN NaN
2  B/C/214  B/G/207  WW_cis NaN NaN
3  B/G/217  B/C/204  WW_cis NaN NaN
4  B/A/216  B/U/205  WW_cis NaN NaN
5  B/C/219  B/G/202  WW_cis NaN NaN
6  B/U/218  B/A/203  WW_cis NaN NaN
7  B/G/201  B/C/220  WW_cis NaN NaN
8  B/A/203  B/U/218  WW_cis NaN NaN

然后您可以只选择您想要的列:

df = df[[0,1,2]]

并像往常一样使用数据帧。

【讨论】:

【参考方案3】:

我认为您将 StringIO 与文件名混淆了。您要么将数据作为字符串,然后使用 StringIO,要么简单地指定文件名(not 使用 StringIO):

In [189]: data="""\
   .....: "B/G/213","B/C/208","WW_cis",,
   .....: "B/U/215","B/A/206","WW_cis",,
   .....: "B/C/214","B/G/207","WW_cis",,
   .....: "B/G/217","B/C/204","WW_cis",,
   .....: "B/A/216","B/U/205","WW_cis",,
   .....: "B/C/219","B/G/202","WW_cis",,
   .....: "B/U/218","B/A/203","WW_cis",,
   .....: "B/G/201","B/C/220","WW_cis",,
   .....: "B/A/203","B/U/218","WW_cis",,
   .....: """

In [190]:

In [190]: df = pd.read_csv(io.StringIO(data), sep=',', header=None, usecols=[0,1,2])

In [191]: df
Out[191]:
         0        1       2
0  B/G/213  B/C/208  WW_cis
1  B/U/215  B/A/206  WW_cis
2  B/C/214  B/G/207  WW_cis
3  B/G/217  B/C/204  WW_cis
4  B/A/216  B/U/205  WW_cis
5  B/C/219  B/G/202  WW_cis
6  B/U/218  B/A/203  WW_cis
7  B/G/201  B/C/220  WW_cis
8  B/A/203  B/U/218  WW_cis

PS 你可以决定你想要解析哪些列(在你的数据框中) - 查看usecols 参数

或者使用文件名

import os

df = pd.read_csv(os.path.join('RNA', self.filename), sep=',', header=None, usecols=[0,1,2])

【讨论】:

以上是关于如何使用 pandas.read_csv 将 CSV 文件中的数据插入数据框?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas `read_csv` 方法使用了太多 RAM

如何使用 pandas.read_csv 将 CSV 文件中的数据插入数据框?

对于不规则的分隔符,如何使 pandas read_csv 中的分隔符更灵活 wrt 空格?

Pandas.read_csv 将所有文件读入一列

如何在使用 pandas.read_csv 读取 csv 文件时将 pandas.dataframe 中的元素转换为 np.float?

如何在使用 pandas.read_csv 读取 csv 文件时将 pandas.dataframe 中的元素转换为 np.float?