pandas 数据读取(csv/txt/excel/json)

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
有关pandas的读取暂时分享这些内容,后续会继续分享对dataframe的常用操作。

猜你喜欢

转载自blog.csdn.net/weixin_47796965/article/details/108557082