将 CSV 文件导入为 pandas DataFrame

Posted

技术标签:

【中文标题】将 CSV 文件导入为 pandas DataFrame【英文标题】:Import CSV file as a pandas DataFrame 【发布时间】:2012-12-31 04:37:52 【问题描述】:

将 CSV 文件读入pandas DataFrame 的 Python 方法是什么(然后我可以将其用于统计操作,可以有不同类型的列等)?

我的CSV文件"value.txt"有以下内容:

Date,"price","factor_1","factor_2"
2012-06-11,1600.20,1.255,1.548
2012-06-12,1610.02,1.258,1.554
2012-06-13,1618.07,1.249,1.552
2012-06-14,1624.40,1.253,1.556
2012-06-15,1626.15,1.258,1.552
2012-06-16,1626.15,1.263,1.558
2012-06-17,1626.15,1.264,1.572

在 R 中,我们将使用以下方法读取此文件:

price <- read.csv("value.txt")  

这将返回一个 R data.frame:

> price <- read.csv("value.txt")
> price
     Date   price factor_1 factor_2
1  2012-06-11 1600.20    1.255    1.548
2  2012-06-12 1610.02    1.258    1.554
3  2012-06-13 1618.07    1.249    1.552
4  2012-06-14 1624.40    1.253    1.556
5  2012-06-15 1626.15    1.258    1.552
6  2012-06-16 1626.15    1.263    1.558
7  2012-06-17 1626.15    1.264    1.572

有没有 Pythonic 方式来获得相同的功能?

【问题讨论】:

你能推荐一下dataframe有什么特别之处吗?你可以用它做什么统计操作? dataframe 可以包含多种类型的数据,例如每一列都可以是一个列表,您可以单独对待每个列表,对其应用一些函数,并讨论统计操作,例如均值 , 标准差 , 四分位数 , ... 谢谢!这实际上对我非常有用。我总是用 csv 模块加载 csv 文件,它给了我一个列表列表。这个 data.frame 听起来好多了! @LWZ:查看我的编辑和链接,如果简洁地回答了您的问题,请查看我的链接。这就是我们在这里“出售”福利包所能做的尽可能多的事情。更广泛的问题“与普通 Python 数组/列表列表相比,使用 pandas 数据帧有什么好处?” 有很多好处,这里就不一一列举了…… 【参考方案1】:

pandas 救援:

import pandas as pd
print pd.read_csv('value.txt')

        Date    price  factor_1  factor_2
0  2012-06-11  1600.20     1.255     1.548
1  2012-06-12  1610.02     1.258     1.554
2  2012-06-13  1618.07     1.249     1.552
3  2012-06-14  1624.40     1.253     1.556
4  2012-06-15  1626.15     1.258     1.552
5  2012-06-16  1626.15     1.263     1.558
6  2012-06-17  1626.15     1.264     1.572

这会返回类似于R's 的熊猫DataFrame。

【讨论】:

在 python 3+ 中不要忘记它是print() 还要确保添加正确的分隔符 pd.read_csv('value.txt', sep='\t')【参考方案2】:

要将 CSV 文件作为 pandas DataFrame 读取,您需要使用 pd.read_csv

但这不是故事的结局;数据以多种不同的格式存在并以不同的方式存储,因此您通常需要将其他参数传递给read_csv,以确保正确读取您的数据。

下表列出了 CSV 文件遇到的常见场景以及您需要使用的相应参数。您通常需要以下参数的全部或部分组合来读取您的数据。

┌──────────────────────────────────────────────────────────┬─────────────────────────────┬────────────────────────────────────────────────────────┐
│  ScenarioArgumentExample                                               │
├──────────────────────────────────────────────────────────┼─────────────────────────────┼────────────────────────────────────────────────────────┤
│  Read CSV with different separator¹                      │  sep/delimiter              │  read_csv(..., sep=';')                                │
│  Read CSV with tab/whitespace separator                  │  delim_whitespace           │  read_csv(..., delim_whitespace=True)                  │
│  Fix UnicodeDecodeError while reading²                   │  encoding                   │  read_csv(..., encoding='latin-1')                     │
│  Read CSV without headers³                               │  header and names           │  read_csv(..., header=False, names=['x', 'y', 'z'])    │
│  Specify which column to set as the index⁴               │  index_col                  │  read_csv(..., index_col=[0])                          │
│  Read subset of columns                                  │  usecols                    │  read_csv(..., usecols=['x', 'y'])                     │
│  Numeric data is in European format (eg., 1.234,56)      │  thousands and decimal      │  read_csv(..., thousands='.', decimal=',')             │
└──────────────────────────────────────────────────────────┴─────────────────────────────┴────────────────────────────────────────────────────────┘

脚注

    默认情况下,read_csv 使用 C 解析器引擎来提高性能。 C 解析器只能处理单个字符分隔符。如果您的 CSV 有 多字符分隔符,您需要修改代码以使用 'python' 引擎。你也可以传递正则表达式:

    df = pd.read_csv(..., sep=r'\s*\|\s*', engine='python')
    

    UnicodeDecodeError 发生在数据以一种编码格式存储但以另一种不兼容的编码格式读取时。最常见的 编码方案是'utf-8''latin-1',你的数据很可能 适合其中之一。

    header=False 指定 CSV 中的第一行是数据行而不是标题行,names=[...] 允许您 指定要分配给 DataFrame 时的列名列表 已创建。

    “未命名:0”发生在具有未命名索引的 DataFrame 保存到 CSV 然后重新读取之后。而不是必须修复 阅读时出现问题,您也可以使用

    解决写作时出现的问题
    df.to_csv(..., index=False)
    

还有一些我在这里没有提到的论点,但这些是你最常遇到的。

【讨论】:

您能否使用例如 Unicode 文本将表格重新粘贴/重新格式化为 Unicode 文本? ozh.github.io/ascii-tables ?否则它很难阅读,并且不会被索引以进行内容搜索,或者可以通过普通的旧 Ctrl-F 文本搜索找到。 @smci 我同意你所说的关于索引的说法(加上图像不能被其他人编辑的事实),但它看起来不太好,需要滚动,这很难理解。跨度> 无论如何你都需要重写它以方便新用户使用;而不是像 'Avoid "Unnamed: 0"' 之类的难以理解的东西,它应该说一些简单的英语,例如 'index_col: 告诉 pandas 将哪些列用作数据框的索引' @smci 看起来 ASCII 表格不能很好地与上标搭配使用——它会弄乱表格格式。 cs95:我推荐 Unicode,而不是 ASCII。 Unicode 工作正常。所以只需在ozh.github.io/ascii-tables的下拉菜单中更改默认值【参考方案3】:

这是使用 Python 内置 csv module 的 pandas 库的替代方案。

import csv
from pprint import pprint
with open('foo.csv', 'rb') as f:
    reader = csv.reader(f)
    headers = reader.next()
    column = h:[] for h in headers
    for row in reader:
        for h, v in zip(headers, row):
            column[h].append(v)
    pprint(column)    # Pretty printer

将打印

'Date': ['2012-06-11',
          '2012-06-12',
          '2012-06-13',
          '2012-06-14',
          '2012-06-15',
          '2012-06-16',
          '2012-06-17'],
 'factor_1': ['1.255', '1.258', '1.249', '1.253', '1.258', '1.263', '1.264'],
 'factor_2': ['1.548', '1.554', '1.552', '1.556', '1.552', '1.558', '1.572'],
 'price': ['1600.20',
           '1610.02',
           '1618.07',
           '1624.40',
           '1626.15',
           '1626.15',
           '1626.15']

【讨论】:

【参考方案4】:
import pandas as pd
df = pd.read_csv('/PathToFile.txt', sep = ',')

这会将您的 .txt 或 .csv 文件导入 DataFrame。

【讨论】:

【参考方案5】:

试试这个

import pandas as pd
data=pd.read_csv('C:/Users/Downloads/winequality-red.csv')

将文件目标位置替换为您的数据集所在的位置,请参考此 url https://medium.com/@kanchanardj/jargon-in-python-used-in-data-science-to-laymans-language-part-one-12ddfd31592f

【讨论】:

【参考方案6】:
%cd C:\Users\asus\Desktop\python
import pandas as pd
df = pd.read_csv('value.txt')
df.head()
    Date    price   factor_1    factor_2
0   2012-06-11  1600.20 1.255   1.548
1   2012-06-12  1610.02 1.258   1.554
2   2012-06-13  1618.07 1.249   1.552
3   2012-06-14  1624.40 1.253   1.556
4   2012-06-15  1626.15 1.258   1.552

【讨论】:

【参考方案7】:

您可以使用 python 标准库中的csv module 来操作 CSV 文件。

示例:

import csv
with open('some.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print row

【讨论】:

-0。来自 R,mazlor 不会寻找 csv 模块,因为它的级别太低。 pandas 提供所请求的抽象级别。 ...此外,它确实将数据读入有用的 Python 对象,例如 numpy 数组...【参考方案8】:

注意很干净,但是:

import csv

with open("value.txt", "r") as f:
    csv_reader = reader(f)
    num = '  '
    for row in csv_reader:
        print num, '\t'.join(row)
        if num == '  ':  
            num=0
        num=num+1

没有那么紧凑,但它可以完成工作:

   Date price   factor_1    factor_2
1 2012-06-11    1600.20 1.255   1.548
2 2012-06-12    1610.02 1.258   1.554
3 2012-06-13    1618.07 1.249   1.552
4 2012-06-14    1624.40 1.253   1.556
5 2012-06-15    1626.15 1.258   1.552
6 2012-06-16    1626.15 1.263   1.558
7 2012-06-17    1626.15 1.264   1.572

【讨论】:

这不能回答 OP 的问题,因为它不会将 csv 数据读入 Python 对象。 也许用for循环中的枚举替换num? @PaulHiemstra,OP 没有提到“对象”,但请放心。不过,我怀疑“熊猫”方法更符合要求。【参考方案9】:
import pandas as pd    
dataset = pd.read_csv('/home/nspython/Downloads/movie_metadata1.csv')

【讨论】:

重复***.com/a/58023154

以上是关于将 CSV 文件导入为 pandas DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:如何比较导入的 csv 文件的列以确保它们相同?

将多个csv文件导入pandas并连接成一个DataFrame

将多个csv文件导入pandas并拼接成一个DataFrame

将多个csv文件导入pandas并合并到一个DataFrame中

Pandas - 导入大小为 4GB 的 CSV 文件时出现内存错误

Pandas:使用循环和分层索引将多个 csv 文件导入数据帧