pandas 数据读取(csv/txt/excel/json)
一、pd.read_csv(txt)
常用参数
这里只介绍一下比较常用的参数,需要更多了解的可以查pandas官方文档
① filepath_or_buffer:需要读取的文件路径,输入路径时可以在可以在路径前加 r 避免转义,路径最好时纯英文
import pandas as pd
df1=pd.read_csv(r'C:/Users/37957/Desktop/demo1.txt')
df1
No | name | age | sex | dep | |
---|---|---|---|---|---|
0 | 1 | wen | 22 | man | a |
1 | 2 | zhou | 25 | woman | b |
2 | 3 | xiao | 23 | man | c |
3 | 4 | chen | 26 | man | d |
② sep:分隔符,默认为’,’
demo2 源数据分隔符为’;'时
No;name;age;sex;dep
1;wen;22;man;a
2;zhou;25;woman;b
3;xiao;23;man;c
4;chen;26;man;d
df2=pd.read_csv(r'C:/Users/37957/Desktop/demo2.txt',sep=';')
df2
No | name | age | sex | dep | |
---|---|---|---|---|---|
0 | 1 | wen | 22 | man | a |
1 | 2 | zhou | 25 | woman | b |
2 | 3 | xiao | 23 | man | c |
3 | 4 | chen | 26 | man | d |
③ header:指定行作为列字段,没有指定‘names’参数时,默认为 header=0,header参数可以是一个list
demo3
No,name,age,sex,dep
序号,姓名,年龄,性别,部门
1,wen,22,man,a
2,zhou,25,woman,b
3,xiao,23,man,c
4,chen,26,man,d
df3=pd.read_csv(r'C:/Users/37957/Desktop/demo3.txt',sep=',',header=[0,1])
df3
No | name | age | sex | dep | |
---|---|---|---|---|---|
序号 | 姓名 | 年龄 | 性别 | 部门 | |
0 | 1 | wen | 22 | man | a |
1 | 2 | zhou | 25 | woman | b |
2 | 3 | xiao | 23 | man | c |
3 | 4 | chen | 26 | man | d |
④ names:设置列名
demo4 源数据没有列字段时:
1,wen,22,man,a
2,zhou,25,woman,b
3,xiao,23,man,c
4,chen,26,man,d
df4=pd.read_csv(r'C:/Users/37957/Desktop/demo4.txt',sep=',',names=['No','name','age','sex','dep'])
df4
No | name | age | sex | dep | |
---|---|---|---|---|---|
0 | 1 | wen | 22 | man | a |
1 | 2 | zhou | 25 | woman | b |
2 | 3 | xiao | 23 | man | c |
3 | 4 | chen | 26 | man | d |
⑤ index_col:设置行索引,默认 None,传参时可分为三种情况
index_col=None 时又会有两种输出情况:1、如果列标题行中的字段数等于数据文件主体中的字段数时,会自动增加一列以0开始的序列(demo5_1)。2、如果列标题行中的字段数比数据文件主体中的字段数少1时,第一列就会设置为索引列(demo5_2);index_col=0 时指定列为索引,可指定多列;index_col=False 关闭索引列推断并丢弃最后一列(如果文件不规则,行尾有分隔符时可用)(demo5_3)
demo5_1
列标题行中的字段数等于数据文件主体中的字段数时:
No,name,age,sex,dep
1,wen,22,man,a
2,zhou,25,woman,b
3,xiao,23,man,c
4,chen,26,man,d
df5_1=pd.read_csv(r'C:/Users/37957/Desktop/demo5_1.txt',sep=',',index_col=None)
df5_1
No | name | age | sex | dep | |
---|---|---|---|---|---|
0 | 1 | wen | 22 | man | a |
1 | 2 | zhou | 25 | woman | b |
2 | 3 | xiao | 23 | man | c |
3 | 4 | chen | 26 | man | d |
demo5_2
列标题行中的字段数少于数据文件主体中的字段数时:
name,age,sex,dep
1,wen,22,man,a
2,zhou,25,woman,b
3,xiao,23,man,c
4,chen,26,man,d
df5_2=pd.read_csv(r'C:/Users/37957/Desktop/demo5_2.txt',sep=',',index_col=None)
df5_2
name | age | sex | dep | |
---|---|---|---|---|
1 | wen | 22 | man | a |
2 | zhou | 25 | woman | b |
3 | xiao | 23 | man | c |
4 | chen | 26 | man | d |
demo5_3
如果文件不规则,行尾有分隔符时:
name,age,sex,dep
wen,22,man,a,
zhou,25,woman,b,
xiao,23,man,c,
chen,26,man,d,
df5_3_1=pd.read_csv(r'C:/Users/37957/Desktop/demo5_3.txt',sep=',',index_col=None)
df5_3_2=pd.read_csv(r'C:/Users/37957/Desktop/demo5_3.txt',sep=',',index_col=False)
print(df5_3_1)
print('--------------------')
print(df5_3_2)
name age sex dep
wen 22 man a NaN
zhou 25 woman b NaN
xiao 23 man c NaN
chen 26 man d NaN
--------------------
name age sex dep
0 wen 22 man a
1 zhou 25 woman b
2 xiao 23 man c
3 chen 26 man d
⑥ usecols:默认None,可给定一个列表,列表中的值必须是文件中的列名或行索引,这个参数可以加快加载速度并降低内存消耗。
⑦ squeeze:默认False,如果文件解析后的数据只包含一列,则返回一个序列。
⑧ prefix:默认None,在没有列标题时,给列添加前缀。例如:添加‘X’ 成为 X0, X1, …
demo8
1,wen,22,man,a
2,zhou,25,woman,b
3,xiao,23,man,c
4,chen,26,man,d
df8=pd.read_csv(r'C:/Users/37957/Desktop/demo8.txt',sep=',',header=None,prefix='X')
df8
X0 | X1 | X2 | X3 | X4 | |
---|---|---|---|---|---|
0 | 1 | wen | 22 | man | a |
1 | 2 | zhou | 25 | woman | b |
2 | 3 | xiao | 23 | man | c |
3 | 4 | chen | 26 | man | d |
⑨ mangle_dupe_cols:默认True,当有重复列时,将‘X’…’X’表示为‘X.0’…’X.N’。
demo9
No,name,age,sex,dep,No
1,wen,22,man,a,2
2,zhou,25,woman,b,3
3,xiao,23,man,c,4
4,chen,26,man,d,5
df9=pd.read_csv(r'C:/Users/37957/Desktop/demo9.txt',sep=',',mangle_dupe_cols=True)
df9
No | name | age | sex | dep | No.1 | |
---|---|---|---|---|---|---|
0 | 1 | wen | 22 | man | a | 2 |
1 | 2 | zhou | 25 | woman | b | 3 |
2 | 3 | xiao | 23 | man | c | 4 |
3 | 4 | chen | 26 | man | d | 5 |
⑩ dtype:默认None,指定列的数据类型
demo10
name,age,sex,dep,tel
wen,22,man,a,012354
zhou,25,woman,b,00123
xiao,23,man,c,12345
chen,26,man,d,0123456
df10_1=pd.read_csv(r'C:/Users/37957/Desktop/demo10.txt',sep=',')
df10_2=pd.read_csv(r'C:/Users/37957/Desktop/demo10.txt',sep=',',dtype={
'tel':str})
print(df10_1)
print('----------------------------')
print(df10_2)
name age sex dep tel
0 wen 22 man a 12354
1 zhou 25 woman b 123
2 xiao 23 man c 12345
3 chen 26 man d 123456
----------------------------
name age sex dep tel
0 wen 22 man a 012354
1 zhou 25 woman b 00123
2 xiao 23 man c 12345
3 chen 26 man d 0123456
⑪ converters:默认为None,用于转换某些列中的值的函数的字典,键可以是字段名或列索引。
⑫ skiprows:默认为None,文件开头要跳过的行数或要跳过的行号(列表,从0开始)。
demo12
这是demo12说明读写数据时请忽略
name,age,sex,dep,tel
wen,22,man,a,012354
zhou,25,woman,b,00123
xiao,23,man,c,12345
chen,26,man,d,0123456
df12=pd.read_csv(r'C:/Users/37957/Desktop/demo12.txt',sep=',',dtype={
'tel':str},skiprows=[0,2])
df12
name | age | sex | dep | tel | |
---|---|---|---|---|---|
0 | zhou | 25 | woman | b | 00123 |
1 | xiao | 23 | man | c | 12345 |
2 | chen | 26 | man | d | 0123456 |
⑬ nrows:默认为None,要读取的文件行数,对读取大文件很有用。
demo13
name,age,sex,dep,tel
wen,22,man,a,012354
zhou,25,woman,b,00123
xiao,23,man,c,12345
chen,26,man,d,0123456
df13=pd.read_csv(r'C:/Users/37957/Desktop/demo13.txt',sep=',',dtype={
'tel':str},nrows=3)
df13
name | age | sex | dep | tel | |
---|---|---|---|---|---|
0 | wen | 22 | man | a | 012354 |
1 | zhou | 25 | woman | b | 00123 |
2 | xiao | 23 | man | c | 12345 |
⑭ encoding:指定字符集类型,通常指定为’utf-8’
⑮ error_bad_lines:默认True,如某行有太多的列(例如,csv行有太多逗号)默认情况下会引发异常,并且不会返回DataFrame。如果为 False,那么这些“异常行”将从返回的DataFrame中删除。
demo15
name,age,sex,dep,tel
wen,22,man,a,012354
zhou,25,wo,ma,n,b,00123
xiao,23,man,c,12345
chen,26,man,d,0123456
df15=pd.read_csv(r'C:/Users/37957/Desktop/demo15.txt',sep=',',dtype={
'tel':str},error_bad_lines=False)
df15
b'Skipping line 3: expected 5 fields, saw 7\n'
name | age | sex | dep | tel | |
---|---|---|---|---|---|
0 | wen | 22 | man | a | 012354 |
1 | xiao | 23 | man | c | 12345 |
2 | chen | 26 | man | d | 0123456 |
⑯ warn_bad_lines:默认True,如果error_bad_lines为假,而warn_bad_lines为真,则将为每个“异常行”输出一个警告。
df16_1=pd.read_csv(r'C:/Users/37957/Desktop/demo15.txt',sep=',',dtype={
'tel':str},error_bad_lines=False,warn_bad_lines=False)
df16_2=pd.read_csv(r'C:/Users/37957/Desktop/demo15.txt',sep=',',dtype={
'tel':str},error_bad_lines=False,warn_bad_lines=True)#输出有异常行警告
print(df16_1)
print('------------------------------')
print(df16_2)
name age sex dep tel
0 wen 22 man a 012354
1 xiao 23 man c 12345
2 chen 26 man d 0123456
------------------------------
name age sex dep tel
0 wen 22 man a 012354
1 xiao 23 man c 12345
2 chen 26 man d 0123456
b'Skipping line 3: expected 5 fields, saw 7\n'
二、pd.read_excel
常用参数
pd.read_excel参数与pd.read_csv参数基本相同,这里介绍一下前前两个参数
① io:需要读取的文件路径。
② sheetname:需要读取的工作表,默认sheetname=0。
传参时可以时工作表的索引号(从0开始),可以时工作表的名称,也可以时一个列表,如[0,2],输出为一个dataframe的字典,当sheetname=Nome时,返回所有工作表组成的dataframe的字典。
df_excel_1=pd.read_excel(r'C:/Users/37957/Desktop/hotel.xlsx',sheetname='Sheet1')
df_excel_1.head()
名称 | 关键字 | 区域 | 地址 | 评价 | 点评人数 | 平均消费 | |
---|---|---|---|---|---|---|---|
0 | 香港嘉湖海逸酒店(Harbour Plaza Resort City) | 休闲度假 | 元朗 | 天水围 天恩路18号 | 4.6 | 17604.0 | 422.0 |
1 | 香港铜锣湾皇悦酒店(Empire Hotel Hong Kong-Causeway Bay) | 浪漫情侣 | 东区 | 铜锣湾永兴街8号 | 4.5 | 12708.0 | 693.0 |
2 | 香港碧荟酒店(The BEACON) | 商务出行 | 油尖旺 | 九龙旺角洗衣街88号 | 4.7 | 328.0 | 747.0 |
3 | 香港湾仔帝盛酒店(Dorsett Wanchai) | 浪漫情侣 | 湾仔 | 皇后大道东387-397号 | 4.4 | 5014.0 | 693.0 |
4 | 如心艾朗酒店(L‘hotel elan) | 浪漫情侣 | 观塘 | 观塘创业街38号 | 4.6 | 3427.0 | 581.0 |
df_excel_2=pd.read_excel(r'C:/Users/37957/Desktop/hotel.xlsx',sheetname=[0,2])
print(type(df_excel_2))
<class 'collections.OrderedDict'>
ExcelFile 类
需要处理同一工作簿中的多个工作表,可以使用ExcelFile类,非常方便。
hotel = pd.ExcelFile(r'C:/Users/37957/Desktop/hotel.xlsx')
print(hotel.sheet_names)
excel_1=hotel.parse(sheetname=hotel.sheet_names[0])
print(excel_1.head())
print(type(excel_1))
['Sheet1', 'Sheet2', 'Sheet3']
名称 关键字 区域 地址 \
0 香港嘉湖海逸酒店(Harbour Plaza Resort City) 休闲度假 元朗 天水围 天恩路18号
1 香港铜锣湾皇悦酒店(Empire Hotel Hong Kong-Causeway Bay) 浪漫情侣 东区 铜锣湾永兴街8号
2 香港碧荟酒店(The BEACON) 商务出行 油尖旺 九龙旺角洗衣街88号
3 香港湾仔帝盛酒店(Dorsett Wanchai) 浪漫情侣 湾仔 皇后大道东387-397号
4 如心艾朗酒店(L‘hotel elan) 浪漫情侣 观塘 观塘创业街38号
评价 点评人数 平均消费
0 4.6 17604.0 422.0
1 4.5 12708.0 693.0
2 4.7 328.0 747.0
3 4.4 5014.0 693.0
4 4.6 3427.0 581.0
<class 'pandas.core.frame.DataFrame'>
三、pd.read_json
常用参数
① path_or_buf,文件路径,默认path_or_buf=None
② orient,预期的json字符串格式,默认None,共五种传参方式
1):split 读取有行索引,列字段和数据构成的json格式:
dict like {index -> [index], columns -> [columns], data -> [values]}
demo1
{‘index’:[1,2,3,4],‘colums’:[‘name’,‘age’],‘data’:[[‘wen’,22],[‘zhou’,23],[‘li’,25],[‘zhang’,18]]}
df_json1=pd.read_json(r'C:/Users/37957/Desktop/demo1.json',orient='split')
print(df_json1)
name age
1 wen 22
2 zhou 23
3 li 25
4 zhang 18
2):records 读取字典组成的列表:
list like [{column -> value}, … , {column -> value}]
demo2:
[{“name”: “wen”,
“age”: “22”},
{“name”: “zhou”,
“age”: “23”},
{“name”: “li”,
“age”: “25”},
{“name”: “zhang”,
“age”: “18”}]
df_json2=pd.read_json(r'C:/Users/37957/Desktop/demo2.json',orient='records')
print(df_json2)
age name
0 22 wen
1 23 zhou
2 25 li
3 18 zhang
3):index 读取以索引为key,以列字段及值构成的字典为键值的格式:
dict like {index -> {column -> value}}
demo3:{“0”:{“name”:“wen”,“age”:“22”},“1”:{“name”:“zhang”,“age”:“25”}}
df_json3=pd.read_json(r'C:/Users/37957/Desktop/demo3.json',orient='index')
print(df_json3)
age name
0 22 wen
1 25 zhang
4):columns 读取以列字段为key,以行索引及值构成的字典为键值的格式
dict like {column -> {index -> value}}
demo4:{“name”:{“0”:“wen”,“1”:“zhang”},“age”:{“0”:“22”,“1”:“25”}}
df_json4=pd.read_json(r'C:/Users/37957/Desktop/demo4.json',orient='columns')
print(df_json4)
age name
0 22 wen
1 25 zhang
5)values 读取嵌套的列表
just the values array
demo5:[[“wen”,22],[“zhang”,25]]
df_json5=pd.read_json(r'C:/Users/37957/Desktop/demo5.json',orient='values')
print(df_json5)
0 1
0 wen 22
1 zhang 25