0%

Pandas系列教程(一):创建和读写

在大多数数据分析项目中第一步往往是读取数据文件,在这个教程中,你将分别通过手动和读取数据文件来创建SeriesDataFrame对象。

1
import pandas as pd

创建数据

pandas中有两个核心的对象: DataFrameSeries

一个DataFrame是一张表格,每个元素有行和列来确定

举例如下:是一个简单的DataFrame

1
pd.DataFrame({'Yes':[50, 21], 'No':[131, 2]})
Yes No
0 50 131
1 21 2

在上面这个例子中,元素"0,No"的值是131。

当然DataFrame元素的值不仅限于整数,举例来说,下面的DataFrame的元素是字符串。

1
pd.DataFrame({'Bob':['I like it', 'It was awful'], 'Sue':['Pretty good', 'Bland']})
Bob Sue
0 I like it Pretty good
1 It was awful Bland

我们在使用pd.DataFrame来创建DataFrame对象。这个语法是最常见的。

你赋值时给的字典的key变成了DataFrame的列的索引,二行的索引默认是从0,1,2...开始

当你不想使用默认的行的索引的时候,你可以加上一个index:

1
2
3
pd.DataFrame({'Bob':['I liked it', 'It was awful'],
'Sue':['Pretty good', 'Bland']},
index=['Product A', 'Product B'])
Bob Sue
Product A I liked it Pretty good
Product B It was awful Bland

一个Series,是数字的一个序列,可以看作是一个列表

1
pd.Series([1,2,3,4,5])
0    1
1    2
2    3
3    4
4    5
dtype: int64

值得注意的是,这样创建出来的序列是一列而不是一行!如果你想为他的列加上索引,你可以加上name字段,如果你想为行加上索引,你可以加上index字段

1
pd.Series([30, 35, 40], index=['2015 Sales', '2016 Sales', '2017 Sales'], name='Product A')
2015 Sales    30
2016 Sales    35
2017 Sales    40
Name: Product A, dtype: int64

从文件中读取数据

通常情况下,我们很少会去手动创建数据,而是读取已经存在的数据

数据可以会以不同格式的文件存储,最常见的往往是CSV格式的文件

当你打开一个CSV文件时,往往是这样的:

csv
Product A,Product B,Product C,
30,21,9,
35,34,1,
41,11,11

一个CSV文件是由逗号分隔的一张表格,CSV的全称是"comma-seperated values"

现在我们将读取一个文件中的数据并将其放入DataFrame中:

1
wine_reviews = pd.read_csv("data/wine-reviews/winemag-data-130k-v2.csv")

我们可以使用shape属性来获得DataFrame的大小

1
wine_reviews.shape
(129971, 14)

我们的DataFrame有130000条记录,每条记录有14个不同的特征值,这几乎是2百万个数据

我们可以使用head命令来获取来获取前5行的数据

1
wine_reviews.head()
Unnamed: 0 country description designation points price province region_1 region_2 taster_name taster_twitter_handle title variety winery
0 0 Italy Aromas include tropical fruit, broom, brimston... Vulkà Bianco 87 NaN Sicily & Sardinia Etna NaN Kerin O’Keefe @kerinokeefe Nicosia 2013 Vulkà Bianco (Etna) White Blend Nicosia
1 1 Portugal This is ripe and fruity, a wine that is smooth... Avidagos 87 15.0 Douro NaN NaN Roger Voss @vossroger Quinta dos Avidagos 2011 Avidagos Red (Douro) Portuguese Red Quinta dos Avidagos
2 2 US Tart and snappy, the flavors of lime flesh and... NaN 87 14.0 Oregon Willamette Valley Willamette Valley Paul Gregutt @paulgwine Rainstorm 2013 Pinot Gris (Willamette Valley) Pinot Gris Rainstorm
3 3 US Pineapple rind, lemon pith and orange blossom ... Reserve Late Harvest 87 13.0 Michigan Lake Michigan Shore NaN Alexander Peartree NaN St. Julian 2013 Reserve Late Harvest Riesling ... Riesling St. Julian
4 4 US Much like the regular bottling from 2012, this... Vintner's Reserve Wild Child Block 87 65.0 Oregon Willamette Valley Willamette Valley Paul Gregutt @paulgwine Sweet Cheeks 2012 Vintner's Reserve Wild Child... Pinot Noir Sweet Cheeks

pandas的read_csv函数有30多个参数。举个例子,你可以看到上面的CSV文件有一列数据是自带的索引,而你恰好就想用这个索引,不用pandas再创建一个附加的索引,这时候,你只要指定一个index_col参数即可,pandas会将index_col那一列自动作为索引

1
2
wine_reviews = pd.read_csv("data/wine-reviews/winemag-data-130k-v2.csv", index_col=0)
wine_reviews.head()
country description designation points price province region_1 region_2 taster_name taster_twitter_handle title variety winery
0 Italy Aromas include tropical fruit, broom, brimston... Vulkà Bianco 87 NaN Sicily & Sardinia Etna NaN Kerin O’Keefe @kerinokeefe Nicosia 2013 Vulkà Bianco (Etna) White Blend Nicosia
1 Portugal This is ripe and fruity, a wine that is smooth... Avidagos 87 15.0 Douro NaN NaN Roger Voss @vossroger Quinta dos Avidagos 2011 Avidagos Red (Douro) Portuguese Red Quinta dos Avidagos
2 US Tart and snappy, the flavors of lime flesh and... NaN 87 14.0 Oregon Willamette Valley Willamette Valley Paul Gregutt @paulgwine Rainstorm 2013 Pinot Gris (Willamette Valley) Pinot Gris Rainstorm
3 US Pineapple rind, lemon pith and orange blossom ... Reserve Late Harvest 87 13.0 Michigan Lake Michigan Shore NaN Alexander Peartree NaN St. Julian 2013 Reserve Late Harvest Riesling ... Riesling St. Julian
4 US Much like the regular bottling from 2012, this... Vintner's Reserve Wild Child Block 87 65.0 Oregon Willamette Valley Willamette Valley Paul Gregutt @paulgwine Sweet Cheeks 2012 Vintner's Reserve Wild Child... Pinot Noir Sweet Cheeks

现在让我们看一下你会遇到的另外一些数据格式,如Excel文件,后缀名是XLS或者XLTS,它本身就是由一张张表格组成的,所以当你读入Excel格式的数据时,你需要一个另外的参数:表格的名称,想下面这个例子:

使用excel打开是这样的 excel格式的文件

1
2
wic = pd.read_excel("data/publicassistance/sub-est2016_all.xlsx", sheet_name='sub-est2016_all')
wic.head()
SUMLEV STATE COUNTY PLACE COUSUB CONCIT PRIMGEO_FLAG FUNCSTAT NAME STNAME CENSUS2010POP ESTIMATESBASE2010 POPESTIMATE2010 POPESTIMATE2011 POPESTIMATE2012 POPESTIMATE2013 POPESTIMATE2014 POPESTIMATE2015 POPESTIMATE2016
0 40 1 0 0 0 0 0 A Alabama Alabama 4779736 4780131 4785492 4799918 4815960 4829479 4843214 4853875 4863300
1 162 1 0 124 0 0 0 A Abbeville city Alabama 2688 2688 2683 2685 2647 2631 2619 2616 2603
2 162 1 0 460 0 0 0 A Adamsville city Alabama 4522 4522 4517 4495 4472 4447 4428 4395 4360
3 162 1 0 484 0 0 0 A Addison town Alabama 758 756 754 753 748 748 747 740 738
4 162 1 0 676 0 0 0 A Akron town Alabama 356 356 355 345 345 342 337 337 334

Excel格式的文件往往是适合人类看的,而不是机器看的,而CSV文件是非常适合机器看的

现在,我们继续另外一种常见的格式:SQL 文件

SQL数据库是再web领域中最常见的用于存储的文件格式,可以使用python创建和数据库的链接,从而读取数据,我们已sqlite3为例

1
2
import sqlite3
conn = sqlite3.connect("data/188-million-us-wildfires/FPA_FOD_20170508.sqlite")

SQL 文件非常不同,你需要写SQL语句来对其进行操作,当然,pandas提供了完善的接口

1
fires = pd.read_sql_query("SELECT * FROM fires", conn)

这条命令的输出是:

1
fires.head()

写入数据到文件中

将数据写入到文件中往往比读取数据简单的多,因为pandas将所有过程都替你处理好了,

将数据写入CSV文件中:

1
wine_reviews.head().to_csv("wine_reviews.csv")

将数据写入excel的文件中

1
wic.to_excel('wic.xlsx', sheet_name='Total Women')

将数据写入sqlite文件中

1
2
conn = sqlite3.connect("fires.sqlite")
fires.head(10).to_sql("fires", conn)
If you like my blog, please donate for me.