pandas学习笔记(一):数据读入读出基本操作

注:学习笔记基于文彤老师的pandas的系列课程

课程链接:https://study.163.com/course/courseMain.htm?courseId=1005124008&share=1&shareId=1146477588

# 设定系统环境
import pandas as pd
pd.options.display.max_rows = 10 # 设定自由列表输出最多为10行
pd.__version__ 
# 显示当前Pandas版本号,默认输出最后一行内容(即使没有打印输出)
'1.1.0'

1. 获取数据

1.1新建数据框

变量列就是一个有顺序的数据序列(一维数组),可以看作是一个增强版的list。 对应了numpy中的Series格式,偷懒的话直接用list格式提供即可,字典格式可以为每个字典元素提供名称,是最佳选择。

pd.DataFrame(

data = None : 数据列表,字典格式时直接同时提供变量名
columns = None : 变量名列表

)

df1 = pd.DataFrame(data = [[1,"test"], [2,"train"],
                           [3,"test"],[4,"train"]], 
                   columns = [ 'var2', 'var3' ]
                  )
df1
var2var3
01test
12train
23test
34train

Series

python的原生数据结构中没有和数组对应的类型。

list虽然比较接近数组的需求,但是没有索引和排序功能。

pd.Series可以被简单理解为带索引的有序列表,从而能够更好的满足数据分析的需求。

s1 = pd.Series(["test","train","test","train"])
s1
0     test
1    train
2     test
3    train
dtype: object
pd.Series(data = ["test","train","test","train"], name = 'var3')
0     test
1    train
2     test
3    train
Name: var3, dtype: object
print(type(df1.var3))
df1.var3
<class 'pandas.core.series.Series'>

0     test
1    train
2     test
3    train
Name: var3, dtype: object

df中的每一列实际上就是一个Series。

Series使用的很多命令都和DataFrame相似,可以直接套用。

1.2读入文本格式数据文件

pd.read_csv(

filepath_or_buffer :要读入的文件路径

sep = ‘,’:列分隔符

header = ‘infer’:指定数据中的第几行作为变量名

names = None :自定义变量名列表

index_col = None :将会被用作索引的列名,多列时只能使用序号列表

usecols = None :指定只读入某些列,使用索引列表或者名称列表均可。

encoding = None:读入文件的编码方式(utf-8/GBK,中文数据文件最好设定为utf-8)

na_values :指定将被读入为缺失值的数值列表,默认下列数据被读入为缺失值:

‘-1.#QNAN’, ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’,
‘’, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’,
‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’

):读取csv格式文件,但也可通用于文本文件读取

df2 = pd.read_csv("univ.csv", encoding ="GBK")#使用英文名称,否则可能会报错
#把文件放到了该目录下,因此不需要再写路径,注意编码要写
df2
名次学校名称总分类型所在省份所在城市办学方向主管部门
01北京大学100.00综合北京北京市中国研究型教育部
12清华大学98.50理工北京北京市中国研究型教育部
23复旦大学82.79综合上海上海市中国研究型教育部
34武汉大学82.43综合湖北武汉市中国研究型教育部
45浙江大学82.38综合浙江杭州市中国研究型教育部
...........................
9596浙江师范大学63.37师范浙江金华市区域特色研究型浙江省
9697安徽大学63.34综合安徽合肥市区域研究型安徽省
9798首都医科大学63.32医药北京北京市区域特色研究型北京市
9899江南大学63.31综合江苏无锡市区域特色研究型教育部
99100山西大学63.29综合山西太原市区域研究型山西省

100 rows × 8 columns

pandas.read_table():更通用的文本文件读取命令

主要的区别在于默认的sep=“\t”,即tab符号。

df2 = pd.read_table("univ.csv", sep=',',encoding ="gbk" )#注意sep
df2
名次学校名称总分类型所在省份所在城市办学方向主管部门
01北京大学100.00综合北京北京市中国研究型教育部
12清华大学98.50理工北京北京市中国研究型教育部
23复旦大学82.79综合上海上海市中国研究型教育部
34武汉大学82.43综合湖北武汉市中国研究型教育部
45浙江大学82.38综合浙江杭州市中国研究型教育部
...........................
9596浙江师范大学63.37师范浙江金华市区域特色研究型浙江省
9697安徽大学63.34综合安徽合肥市区域研究型安徽省
9798首都医科大学63.32医药北京北京市区域特色研究型北京市
9899江南大学63.31综合江苏无锡市区域特色研究型教育部
99100山西大学63.29综合山西太原市区域研究型山西省

100 rows × 8 columns

df2.agg("count")
名次      100
学校名称    100
总分      100
类型      100
所在省份    100
所在城市    100
办学方向    100
主管部门    100
dtype: int64

1.3读入EXCEL文件

pd.read_excel(

filepath_or_buffer:要读入的文件路径

sheet_name:要读入的表单,字符串或者数字序号均可,默认读入第一个
)

df2 = pd.read_excel("高校信息.xlsx", sheet_name = 0)
df2
名次学校名称总分类型所在省份所在城市办学方向主管部门
01北京大学100.00综合北京北京市中国研究型教育部
12清华大学98.50理工北京北京市中国研究型教育部
23复旦大学82.79综合上海上海市中国研究型教育部
34武汉大学82.43综合湖北武汉市中国研究型教育部
45浙江大学82.38综合浙江杭州市中国研究型教育部
...........................
9596浙江师范大学63.37师范浙江金华市区域特色研究型浙江省
9697安徽大学63.34综合安徽合肥市区域研究型安徽省
9798首都医科大学63.32医药北京北京市区域特色研究型北京市
9899江南大学63.31综合江苏无锡市区域特色研究型教育部
99100山西大学63.29综合山西太原市区域研究型山西省

100 rows × 8 columns

2.读入统计软件数据集

2.1直接读入SAS/Stata/SPSS数据文件

pd.read_sas() # 必要时可以使用encoding选项
pd.read_spss() # 0.25 版之后新增
pd.read_stata()

df4 = pd.read_sas('air.sas7bdat')
df4
DATEAIR
01949-01-01112.0
11949-02-01118.0
21949-03-01132.0
31949-04-01129.0
41949-05-01121.0
.........
1391960-08-01606.0
1401960-09-01508.0
1411960-10-01461.0
1421960-11-01390.0
1431960-12-01432.0

144 rows × 2 columns

pd.read_spss(

path : 要读入的文件路径

usecols = None : 需要读入的变量列表,list-like,默认全部读入

convert_categoricals = True : 是否将类别列转换为pd.Categorical

)

# read_spss()只能获取数据本身,数据的附加信息会全部丢失
# read_spss()无法直接读取GBK编码的数据文件
spssfile = pd.read_spss('air.sav')
spssfile.head()
DATEAIR
01949-01-01112.0
11949-02-01118.0
21949-03-01132.0
31949-04-01129.0
41949-05-01121.0

2.2用pyreadstat包读入SPSS文件

pyreadstat包可以作为pandas的接口直接读写SAS、SPSS、Stata数据文件。

read_spss()本质上只是对pyreadstat包的简单调用。

除读入数据外,还可以提取完整的数据附加信息供使用。

#pip install pyreadstat

pyreadstat.read_sav(

filename_path : 需要读取的文件路径,utf-8格式。

encoding = None : 指定数据读入的编码,iconv-compatible名称。

usecols : 需要读入的变量列,list格式。

metadataonly = False : 只读取matadata,不读取具体数据.

apply_value_formats = False : 用值标签代替原始数值读入。如果变量值为true,0代表男,1代表女,那么读入时候把0换成男,1会换成女。

formats_as_category = True : 当apply_value_formtas为True时,是否将设定格式的变量值转化为pd.categories。

user_missing = False : 是否按原值读入自定义缺失值,否则一律读入为nan。

dates_as_pandas_datetime = False : 将date转换为pd.datetime64格式。

disable_datetime_conversion = False : 是否自动转换日期时间变量,否则一律按照数值读入。

row_limit = 0 : 读入的最大行数,0为无限制。

row_offset = 0 : 读入时跳开前多少行。

)
#返回两个数据,因此最好用两个变量接受,不然会变成元组:

data_frame : 包括全部数据

metadata : 包括附加信息的metadata对象

# 直接用pyreadstat包可以取出更多信息
import pyreadstat

df, meta = pyreadstat.read_sav("ccss_sample.sav", encoding = "GBK")

df.head()
timeids0s2s3s4s5s7s9c0_1...Qs9Qa3Qa4Qa8Qa9Qa10Qa16index1index1aindex1b
0200704.01.0100.01.020.04.03.02.04.02.0...2500.0100.0200.0200.0200.0100.0100.0109.34937188.035919121.071238
1200704.02.0100.01.024.02.03.02.08.02.0...7000.0100.0100.0100.0150.0200.0100.093.72803288.03591996.856991
2200704.03.0200.01.020.02.09.02.02.02.0...1250.0100.0150.0150.0100.0100.0100.093.72803288.03591996.856991
3200704.04.0100.02.065.03.01.01.02.02.0...1250.0150.0150.0100.0100.0100.0200.0109.349371154.06285884.749867
4200704.05.0200.02.040.02.03.01.0NaN2.0...NaN100.0100.0100.0100.0150.0100.085.91736388.03591984.749867

5 rows × 32 columns

meta.column_labels#读入列变量名称的标签的附加信息
['月份',
 'ID',
 'S0. 城市',
 'S2. 性别',
 'S3. 年龄',
 'S4. 学历',
 'S5. 职业',
 'S7. 婚姻状况',
 'S9. 家庭月收入',
 ......
 'A9. 那么您认为一年之后本地区的就业状况将会如何变化?',
 None,
 None,
 None,
 '总指数',
 '现状指数',
 '预期指数']
meta.column_names_to_labels#读入名称和变量名称之间的
{'O1': 'O1. 是否拥有家用轿车',
 'Qa10': None,
 'Qa16': None,
 'Qa3': None,
 'Qa4': None,
 'Qa8': None,
  ......
 'index1a': '现状指数',
 'index1b': '预期指数',
 's0': 'S0. 城市',
 's2': 'S2. 性别',
 's3': 'S3. 年龄',
 's4': 'S4. 学历',
 's5': 'S5. 职业',
 's7': 'S7. 婚姻状况',
 's9': 'S9. 家庭月收入',
 'time': '月份'}
meta.value_labels
#变量值标签,label0就指代第一个变量,apply_value_formats可实现该转换
{'labels0': {100.0: '100北京', 200.0: '200上海', 300.0: '300广州'},
 'labels1': {1.0: '男', 2.0: '女'},
 'labels10': {1.0: '1 非常好',
  2.0: '2 比较好',
  3.0: '3 保持现状',
  4.0: '4 比较差',
  5.0: '5 非常差',
  9.0: '9 说不清/拒答'},
 ......
 'labels9': {0.0: '中性原因',
  10.0: '改善:收入相关',
  20.0: '改善:就业状况相关',
  30.0: '改善:投资相关',
  40.0: '改善:家庭开支相关',
  50.0: '改善:政策/宏观经济',
  90.0: '不知道/拒答',
  110.0: '恶化:收入相关',
  120.0: '恶化:就业状况相关',
  130.0: '恶化:投资相关',
  140.0: '恶化:家庭开支相关',
  150.0: '恶化:政策/宏观经济相关'}}
# 这里的得到的res实际上是tuple(元组)
res = pyreadstat.read_sav("ccss_sample.sav", 
                          encoding = "GBK", 
                          apply_value_formats = True) 
res[0].head()
timeids0s2s3s4s5s7s9c0_1...Qs9Qa3Qa4Qa8Qa9Qa10Qa16index1index1aindex1b
0200704.01.0100北京20.0本科公司普通职员(白领)未婚2000-2999元2 无...2500.0100.0200.0200.0200.0100.0100.0109.34937188.035919121.071238
1200704.02.0100北京24.0高中/中专公司普通职员(白领)未婚6000-7999元2 无...7000.0100.0100.0100.0150.0200.0100.093.72803288.03591996.856991
2200704.03.0200上海20.0高中/中专无业/待业/失业/家庭主妇未婚1000-1499元2 无...1250.0100.0150.0150.0100.0100.0100.093.72803288.03591996.856991
3200704.04.0100北京65.0大专企/事业管理人员已婚1000-1499元2 无...1250.0150.0150.0100.0100.0100.0200.0109.349371154.06285884.749867
4200704.05.0200上海40.0高中/中专公司普通职员(白领)已婚NaN2 无...NaN100.0100.0100.0100.0150.0100.085.91736388.03591984.749867

5 rows × 32 columns

res[0].s9.head()
0    2000-2999元
1    6000-7999元
2    1000-1499元
3    1000-1499元
4           NaN
Name: s9, dtype: category
Categories (13, object): [1000-1499元, 10000-14999元, 1500-1999元, 15000-19999元, ..., 5000-5999元, 6000-7999元, 8000-9999元, 999元或以下]

读入数据表
pd.read_sql(

sql : 需要执行的SQl语句/要读入的表名称

con : SQLAlchemy连接引擎名称

index_col = None : 将被用作索引的列名称

columns = None : 当提供表名称时,需要读入的列名称list
)

spssfile = pd.read_spss('air.sav')
spssfile.to_numpy()
array([[datetime.date(1949, 1, 1), 112.0],
       [datetime.date(1949, 2, 1), 118.0],
       [datetime.date(1949, 3, 1), 132.0],
       [datetime.date(1949, 4, 1), 129.0],
       [datetime.date(1949, 5, 1), 121.0],
       ......
       [datetime.date(1960, 8, 1), 606.0],
       [datetime.date(1960, 9, 1), 508.0],
       [datetime.date(1960, 10, 1), 461.0],
       [datetime.date(1960, 11, 1), 390.0],
       [datetime.date(1960, 12, 1), 432.0]], dtype=object)

实战:读入北京PM2.5数据

df3 = pd.read_csv("PM25\Beijing_2012_HourlyPM2.5_created20140325.csv",encoding ="gbk" )#注意sep
df3.iloc[2:]#从第三行开始输出数据
A fact sheet with definitions and metadata for this dataset can be found at http://www.stateair.net/web/historical/1/1.html.Unnamed: 1Unnamed: 2Unnamed: 3Unnamed: 4Unnamed: 5Unnamed: 6Unnamed: 7Unnamed: 8Unnamed: 9Unnamed: 10
2SiteParameterDate (LST)YearMonthDayHourValueUnitDurationQC Name
3BeijingPM2.52012-1-1 0:002012110303礸/mg?1 HrValid
4BeijingPM2.52012-1-1 1:002012111215礸/mg?1 HrValid
5BeijingPM2.52012-1-1 2:002012112222礸/mg?1 HrValid
6BeijingPM2.52012-1-1 3:00201211385礸/mg?1 HrValid
....................................
8782BeijingPM2.52012-12-31 19:002012123119131礸/mg?1 HrValidNaN
8783BeijingPM2.52012-12-31 20:002012123120113礸/mg?1 HrValidNaN
8784BeijingPM2.52012-12-31 21:00201212312145礸/mg?1 HrValidNaN
8785BeijingPM2.52012-12-31 22:00201212312239礸/mg?1 HrValidNaN
8786BeijingPM2.52012-12-31 23:00201212312335礸/mg?1 HrValidNaN

8785 rows × 11 columns

bj2014 = pd.read_csv("PM25\Beijing_2014_HourlyPM25_created20150203.csv",encoding ="gbk",usecols=[0,1,2,3,4,5,6,7,8,9,10])
#注意sep,去掉文件开头的繁杂信息就可以了。
bj2014
SiteParameterDate (LST)YearMonthDayHourValueUnitDurationQC Name
0BeijingPM2.52014-1-1 0:00201411053礸/m?1 HrValidNaN
1BeijingPM2.52014-1-1 1:00201411165礸/m?1 HrValidNaN
2BeijingPM2.52014-1-1 2:00201411270礸/m?1 HrValidNaN
3BeijingPM2.52014-1-1 3:00201411379礸/m?1 HrValidNaN
4BeijingPM2.52014-1-1 4:00201411492礸/m?1 HrValidNaN
....................................
8755BeijingPM2.52014-12-31 19:00201412311910礸/m?1 HrValidNaN
8756BeijingPM2.52014-12-31 20:00201412312010礸/m?1 HrValidNaN
8757BeijingPM2.52014-12-31 21:0020141231218礸/m?1 HrValidNaN
8758BeijingPM2.52014-12-31 22:00201412312212礸/m?1 HrValidNaN
8759BeijingPM2.52014-12-31 23:00201412312320礸/m?1 HrValidNaN

8760 rows × 11 columns

bj2012 = pd.read_csv("PM25\Beijing_2012_HourlyPM2.5_created20140325.csv",encoding ="gbk",skiprows=2)#注意sep
bj2012
Unnamed: 0Unnamed: 1Unnamed: 2Unnamed: 3Unnamed: 4Unnamed: 5Unnamed: 6Unnamed: 7Unnamed: 8Unnamed: 9Unnamed: 10
0SiteParameterDate (LST)YearMonthDayHourValueUnitDurationQC Name
1BeijingPM2.52012-1-1 0:002012110303礸/mg?1 HrValid
2BeijingPM2.52012-1-1 1:002012111215礸/mg?1 HrValid
3BeijingPM2.52012-1-1 2:002012112222礸/mg?1 HrValid
4BeijingPM2.52012-1-1 3:00201211385礸/mg?1 HrValid
....................................
8780BeijingPM2.52012-12-31 19:002012123119131礸/mg?1 HrValidNaN
8781BeijingPM2.52012-12-31 20:002012123120113礸/mg?1 HrValidNaN
8782BeijingPM2.52012-12-31 21:00201212312145礸/mg?1 HrValidNaN
8783BeijingPM2.52012-12-31 22:00201212312239礸/mg?1 HrValidNaN
8784BeijingPM2.52012-12-31 23:00201212312335礸/mg?1 HrValidNaN

8785 rows × 11 columns

3.保存数据

3.1 保存数据至外部文件

df.to_csv(

filepath_or_buffer:要保存的文件路径

sep = ‘,’ :列分隔符

columns :需要导出的变量列表

header = True :指定导出数据的新变量名,可直接提供list

index = True :是否导出索引

mode = ‘w’ : Python写模式,读写方式:r , r+ , w , w+ , a , a+

encoding = ‘utf-8’ :默认导出的文件编码格式

)

df2.to_csv('temp.txt', columns =['名次','总分'], header = ['名次2','总分2'], index = False)
#header要和表列的个数相对应

excel上面to_csv的命令也可以用,同时注意下面的命令

df.to_excel(

filepath_or_buffer:要读入的文件路径

sheet_name = ‘Sheet1’ :要保存的表单名称

)

df2.to_excel('temp.xlsx', index = False, sheet_name = 'data')

pyreadstat.write_sav(

df : 要保存的df名称。

dst_path : 要保存的sav/zsav文件路径及名称。

compress = Flase : 是否保存为压缩的zsav格式。

column_labels : 所保存文件的变量名标签list。(list必须和变量列等长,无标签的用None表示。)

variable_value_labels : 所保存文件的变量值标签,dict格式。(key为变量名,value为具体数值和值标签的dict。)

missing_ranges : 用户自定义缺失值,dict格式。(key为变量名,value为list格式。list元素的设定格式和SPSS中的格式相同。)

variable_measure : 变量测量尺度,dict格式。(dict的values为 “nominal”, “ordinal”, “scale” or “unknown” 。)

note : 所保存文件的文件注释。

file_label : 所保存文件的文件标签。

variable_display_width : 变量列显示宽度,dict格式。

)

spssfile = pd.read_spss('air.sav')
spssfile.head()
DATEAIR
01949-01-01112.0
11949-02-01118.0
21949-03-01132.0
31949-04-01129.0
41949-05-01121.0
# 如果外部文件已存在,命令不会被执行,且不报错。
pyreadstat.write_sav(spssfile, 'tmp.sav',
                     column_labels = [None, 'var b'],
                     variable_value_labels = {'AIR' : {1 : 'a',
                                                       2 : 'b'}})

3.2 保存数据至数据库

df.to_sql(

name : 将要存储数据的表名称

con : SQLAlchemy引擎/DBAPI2连接引擎名称

if_exists = ‘fail’ : 指定表已经存在时的处理方式
( fail : 不做任何处理(不插入新数据)
replace : 删除原表并重建新表
append : 在原表后插入新数据
)

index = True : 是否导出索引

)

实战:保存北京PM2.5数据为数据文件

bj2012.to_excel('bj2012.xlsx', index = False, 
                sheet_name = 'data',header=False)
#如果已经有源文件,保证原文件关闭
#header=False 可以把unnamed哪一行去掉
bj2012.to_csv('bj2012.csv', index = False, header=False)
bj2012.to_csv('bj2012.txt', index = False, header=False)
  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值