导入CSV文件作为pandas DataFrame


90

将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

有没有Python的方法来获得相同的功能?


您会赞扬数据框有什么特别之处,以及您可以对它进行哪些统计操作?
LWZ

3
数据框可以包含不止一种类型的数据,例如每列可以是一个列表,您可以对待每个列表单独地应用一些函数,并谈论统计运算,如具有均值,标准差,四分位数,。 ..
mazlor

谢谢!这实际上对我很有用。我一直使用csv模块加载csv文件,该模块为我提供了列表列表。这个data.frame听起来更好!
LWZ

@LWZ:查看我的编辑和链接,如果lmk能够简洁地回答您的问题,请输入lmk。这就是我们在这里可以“出售”福利计划的最大努力。更大的问题“与普通的Python数组/列表列表相比,使用pandas数据框有什么好处?” 有很多好处,这里太多了……
smci

Answers:


159

救援熊猫

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

这会返回与相似的pandas DataFrameR's


9

这是使用Python内置的csv模块的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']}

9

要将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=',')             │
└──────────────────────────────────────────────────────────┴─────────────────────────────┴────────────────────────────────────────────────────────┘

脚注

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

    df = pd.read_csv(..., sep=r'\s*\|\s*', engine='python')
    
  2. UnicodeDecodeError当数据以一种编码格式存储但以另一种不兼容的格式读取时,会发生这种情况。最常见的编码方案是'utf-8''latin-1',您的数据很可能适合其中一种。

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

  4. 当具有未命名索引的DataFrame保存到CSV,然后在以后重新读取时,将发生“未命名:0”。不必在阅读时解决问题,也可以通过使用来解决问题

    df.to_csv(..., index=False)
    

我这里没有提到其他参数,但这是您最常遇到的参数。


1
您能否使用例如ozh.github.io/ascii-tables重新将表格图像重新格式化为Unicode文本?否则,它很难阅读,也不会为内容搜索建立索引,也无法通过普通的旧Ctrl-F文本搜索找到。
smci

@smci我同意您所说的关于索引编制的观点(以及图像不能被其他人编辑的事实),但它看起来不尽如人意,并且需要滚动操作,这使其难以理解。
cs95

无论如何,您都需要重写它以便对新用户友好。而不是诸如“避免“未命名:0””之类的令人费解的东西,它应该说些普通的英语,如index_col:告诉pandas将哪个列用作数据
框的

@smci看起来ASCII表不能很好地与上标一起使用-弄乱了表格式。
cs95

cs95:我建议使用Unicode,而不是ASCII。Unicode工作正常。因此,只需在ozh.github.io/ascii-tables
smci

6
import pandas as pd
df = pd.read_csv('/PathToFile.txt', sep = ',')

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



1
%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

0

您可以使用python标准库中的csv模块来处理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提供所需的抽象级别。
Steven Rumbalski

...此外,它的确会将数据读入有用的Python对象(例如numpy数组)中
Paul Hiemstra 2013年

0

将熊猫作为pd
数据集导入= pd.read_csv('/ home / nspython / Downloads / movie_metadata1.csv')


-1

注意很干净,但是:

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

1
这不会回答OP的问题,因为它不会将csv数据读入Python对象。
Paul Hiemstra 2013年

也许用for循环中的枚举替换num?
LWZ

@ PaulHiemstra,OP未提及“对象”,但请您放心。不过,我怀疑“熊猫”方法更适合所要求的。
Lee-Man
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.