Python数据分析第二课:数据的写入与读取

一 数据的写入

我们可以将数据写入到文件中进行永久性的保存,支持的文件格式有HTML、CSV、JSON、Excel。

csv是最为常见的以纯文本文件存储数据文件的格式,它的优点是通用性很强,不受操作系统以及具体的软件的限制。我们以写入csv为例,看一下pandas是如何是将数据写入csv文件中。

from pandas import Series, DataFrame
import pandas as pd

# 使用字典创建
index_list = ['001','002','003','004','005','006','007','008','009','010']
name_list = ['星宿老怪', '李莫愁', '乔峰', '段誉', '虚竹', '阿紫', '逍遥子','慕容复','陈语嫣','段正淳']
age_list = [80, 36, 27, 25, 26, 22, 98,25,23,45]
role_list = ['配角', '配角', '主角', '主角', '主角', '配角', '老配角','大反派','神仙姐姐','老浪子']
char_list = ['化功大法', '钢铁浮尘', '降龙十八掌', '六脉神剑', '泡妞大法', '毒力无敌','北冥神功', '以彼之道还施彼身','知识渊博,不能动手','炮友遍天下']
pro_list = ['星宿老仙,法力无边', '哼,杨过和小龙女不能在一起', '小子,看我降龙十八掌', '姐姐,我有六脉神剑哦', '梦姑,你在哪里啊?我好想你', '姐夫,我要和你在一起,我要和你困觉',
              '哈哈,你的围棋功力太弱了','我大燕复国指日可待','美貌就是我的武器','我的骚气无人能档,哈哈哈']
dic = {'姓名':Series(data = name_list,index = index_list),
      '年龄':Series(data = age_list,index = index_list),
      '角色':Series(data = role_list,index = index_list),
      '武功':Series(data = char_list,index = index_list),
      '口号':Series(data = pro_list,index = index_list)}
df = DataFrame(dic)
print(df)

# 输出结果:
       姓名  年龄    角色         武功                 口号
001  星宿老怪  80    配角       化功大法          星宿老仙,法力无边
002   李莫愁  36    配角       钢铁浮尘      哼,杨过和小龙女不能在一起
003    乔峰  27    主角      降龙十八掌         小子,看我降龙十八掌
004    段誉  25    主角       六脉神剑         姐姐,我有六脉神剑哦
005    虚竹  26    主角       泡妞大法      梦姑,你在哪里啊?我好想你
006    阿紫  22    配角       毒力无敌  姐夫,我要和你在一起,我要和你困觉
007   逍遥子  98   老配角       北冥神功       哈哈,你的围棋功力太弱了
008   慕容复  25   大反派   以彼之道还施彼身          我大燕复国指日可待
009   陈语嫣  23  神仙姐姐  知识渊博,不能动手           美貌就是我的武器
010   段正淳  45   老浪子      炮友遍天下       我的骚气无人能档,哈哈哈


# 写入csv文件,path_or_buf为写入纯文本文件
df.to_csv(path_or_buf='./天龙八部.csv',encoding='utf-8-sig')
print('end')

在上面的代码里,我们创建了一个DataFrame,接着通过to_csv()方法将DataFrame保存为csv文件。

从结果中可以发现,to_csv()保存数据时,df的行索引作为一列被输出到csv文件中。

如何在保存csv文件的时候,不存储DataFrame的行索引信息呢,我们看下面的解决方法。

# 写入csv文件,path_or_buf为写入纯文本文件
df.to_csv(path_or_buf='./天龙八部.csv',index=False,encoding='utf-8-sig')
print('end')

# 写入excel文件
df.to_excel('./天龙八部.xlsx',index=False,encoding='utf-8-sig')
print('end2')

在to_csv方法中将参数index设置为False就可以不存储DataFrame的行索引信息。

在to_csv方法参数中设置encoding=‘utf_8_sig’,此举为何呢?

在这里插入图片描述
因为to_csv()方法生成csv文件时,打开文件时都是乱码,encoding参数设置“utf_8_sig”后乱码就会消失。

utf-8与utf-8-sig的区别:

  1. ”utf-8“ 是以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序问题,因此它不需要BOM,所以当用"utf-8"编码方式读取带有BOM的文件时,它会把BOM当做是文件内容来处理, 也就会发生类似上边的错误.
  2. “uft-8-sig"中sig全拼为 signature 也就是"带有签名的utf-8”, 因此"utf-8-sig"读取带有BOM的"utf-8文件时"会把BOM单独处理,与文本内容隔离开,也是我们期望的结果。

二 数据的读取

# 读取csv文件
df2 = pd.read_csv('/Users/davidlin/Desktop/study/数据分析/第二章/天龙八部.csv')
print(df2)
print('-'*20)
# 获取文件的行数与列数
print(df2.shape)
print('-'*20)
# 获取前3行和后3行
print(df2.head(3))
print('-'*20)
print(df2.tail(3))

# 输出结果:
     姓名  年龄    角色         武功                 口号
0  星宿老怪  80    配角       化功大法          星宿老仙,法力无边
1   李莫愁  36    配角       钢铁浮尘      哼,杨过和小龙女不能在一起
2    乔峰  27    主角      降龙十八掌         小子,看我降龙十八掌
3    段誉  25    主角       六脉神剑         姐姐,我有六脉神剑哦
4    虚竹  26    主角       泡妞大法      梦姑,你在哪里啊?我好想你
5    阿紫  22    配角       毒力无敌  姐夫,我要和你在一起,我要和你困觉
6   逍遥子  98   老配角       北冥神功       哈哈,你的围棋功力太弱了
7   慕容复  25   大反派   以彼之道还施彼身          我大燕复国指日可待
8   陈语嫣  23  神仙姐姐  知识渊博,不能动手           美貌就是我的武器
9   段正淳  45   老浪子      炮友遍天下       我的骚气无人能档,哈哈哈
--------------------
(10, 5)
--------------------
     姓名  年龄  角色     武功             口号
0  星宿老怪  80  配角   化功大法      星宿老仙,法力无边
1   李莫愁  36  配角   钢铁浮尘  哼,杨过和小龙女不能在一起
2    乔峰  27  主角  降龙十八掌     小子,看我降龙十八掌
--------------------
    姓名  年龄    角色         武功            口号
7  慕容复  25   大反派   以彼之道还施彼身     我大燕复国指日可待
8  陈语嫣  23  神仙姐姐  知识渊博,不能动手      美貌就是我的武器
9  段正淳  45   老浪子      炮友遍天下  我的骚气无人能档,哈哈哈

根据结果我们可以看出,调用read_csv()方法并传入文件的路径,就可以将数据读取出来并且是DataFrame类型。

还可以看出,read_csv()默认会将文件中的第一行作为数据的列索引。

如果csv文件的第一行或者其他行不满足我们的需求时,我们需要自己修改。当csv数据的第一行是一条脏数据,不符合我们要求时,可以利用read_csv()中的header参数进行选择哪一行作为我们的列索引。

我们现在对”天龙八部.csv“的第一行进行修改,读取一次看看结果是怎样的。
在这里插入图片描述

# 读取csv文件
df2 = pd.read_csv('/Users/davidlin/Desktop/study/数据分析/第二章/天龙八部.csv',header=0)
# 获取列索引
print(df2.columns)

# 输出结果:
Index(['哈哈', '什么玩意', '我不要', '我不有点困啊', '的', '啊啊啊啊'], dtype='object')
# 读取csv文件
df2 = pd.read_csv('/Users/davidlin/Desktop/study/数据分析/第二章/天龙八部.csv',header=1)
# 获取列索引
print(df2.head())

# 输出结果:
     姓名  年龄  角色     武功             口号  Unnamed: 5
0  星宿老怪  80  配角   化功大法      星宿老仙,法力无边         NaN
1   李莫愁  36  配角   钢铁浮尘  哼,杨过和小龙女不能在一起         NaN
2    乔峰  27  主角  降龙十八掌     小子,看我降龙十八掌         NaN
3    段誉  25  主角   六脉神剑     姐姐,我有六脉神剑哦         NaN
4    虚竹  26  主角   泡妞大法  梦姑,你在哪里啊?我好想你         NaN

第六列为何是NaN,是因为我们刚才在修改CSV文件时,在第六列中也添加了内容

  • read_csv()的header参数默认是0,取第一行的值,可以根据具体的要求设置header的值来确定列索引。

  • 如果都不满足要求,可以将header设置为None,列索引值会使用默认的1、2、3、4,之后在自行设置。

当指定了header的值,读出来的数据就是从该行开始向下切片,该行以上的数据会被忽略。

Excel文件的读取

一个Excel文件可以创建多个表,然后在不同的表中存储不同数据,这种形式的文件很常见。但是要注意csv文件不存在多个sheet的问题。
所以,如果是Excel文件就需要考虑,如何从Excel中读取出其中的一个表。

  • Excel文件的读取和csv的读取方式相似,read_csv()读取csv文件,read_excel()读取Excel文件。
# 读取excel文件
sheet = pd.read_excel('/Users/davidlin/Desktop/study/数据分析/第二章/天龙八部.xlsx')
print(sheet.head())

# 输出结果:
     姓名  年龄  角色     武功             口号
0  星宿老怪  80  配角   化功大法      星宿老仙,法力无边
1   李莫愁  36  配角   钢铁浮尘  哼,杨过和小龙女不能在一起
2    乔峰  27  主角  降龙十八掌     小子,看我降龙十八掌
3    段誉  25  主角   六脉神剑     姐姐,我有六脉神剑哦
4    虚竹  26  主角   泡妞大法  梦姑,你在哪里啊?我好想你

刚才在读取excel文件时,报错”ImportError: Missing optional dependency ‘xlrd’“,只需到终端中pip install xlrd后,再次运行代码即可。

read_csv()会比read_excel()少一个sheet_name的参数,这个参数就是可以指定表的名字,如果不输入该参数,默认读取第一个工作表。

# 读取excel文件
sheet1 = pd.read_excel('/Users/davidlin/Desktop/study/数据分析/第二章/天龙八部.xlsx',sheet_name='Sheet1')
print(sheet1.head())
print('-'*20)
sheet2 = pd.read_excel('/Users/davidlin/Desktop/study/数据分析/第二章/天龙八部.xlsx',sheet_name='Sheet2')
print(sheet2.head())

# 输出结果:
     姓名  年龄  角色     武功             口号
0  星宿老怪  80  配角   化功大法      星宿老仙,法力无边
1   李莫愁  36  配角   钢铁浮尘  哼,杨过和小龙女不能在一起
2    乔峰  27  主角  降龙十八掌     小子,看我降龙十八掌
3    段誉  25  主角   六脉神剑     姐姐,我有六脉神剑哦
4    虚竹  26  主角   泡妞大法  梦姑,你在哪里啊?我好想你
--------------------
          日期  推广位置          收入          刷新次数
0 2017-06-01  首页频道  2384116.18  1.092741e+10
1 2017-06-01  灌水频道    37669.50  4.896842e+08
2 2017-06-02  首页频道  2483506.11  1.152722e+10
3 2017-06-02  灌水频道    35883.93  4.907737e+08
4 2017-06-03  首页频道  2742761.71  1.225602e+10

在上面的代码里,我们引入了带有两个表的”天龙八部.xlsx“的Excel文件,两个表名分别为’Sheet1’,‘Sheet2’,然后我们通过指定sheet_name的值,获取不同表中的数据。

三 总结

在这里插入图片描述

四 练习

  1. 读取”天龙八部.xlsx“文件sheet2的数据
    - 打印出行数、列数以及列索引;
    - 打印出前三行和后三行数据
    - 随机打印5条信息
from pandas import Series, DataFrame
import pandas as pd
import random
# 读取excel文件
sheet2 = pd.read_excel('/Users/davidlin/Desktop/study/数据分析/第二章/天龙八部.xlsx',sheet_name='Sheet2')
# 获取行数与列数
print(sheet2.shape)
# 获取列索引
print(sheet2.columns.tolist())
# 打印前三行与后三行的数据
print(sheet2.head(3))
print('-'*20)
print(sheet2.tail(3))

print('-'*20)
# 获取随机5行数据的第一种方法
# 获取行索引,输出为列表
index_list2 = sheet2.index.tolist()
# 循环5次,获取5行数据
for i in range(5):
    # 从行索引列表中随机获取行索引
    num = random.choice(index_list2)
    # 通过loc[]获取行数据
    print(sheet2.loc[[num]])

print('-'*20)
# 获取随机5行数据的第一种方法,通过iloc[]方法

index_list3 = sheet2.index.tolist()
for i in range(5):
    num2 = random.randint(0,len(index_list3))
    print(sheet2.iloc[[num2]])

# 输出结果:
(222, 4)
['日期', '推广位置', '收入', '刷新次数']
          日期  推广位置          收入          刷新次数
0 2017-06-01  首页频道  2384116.18  1.092741e+10
1 2017-06-01  灌水频道    37669.50  4.896842e+08
2 2017-06-02  首页频道  2483506.11  1.152722e+10
--------------------
            日期  推广位置          收入          刷新次数
219 2017-09-18  灌水频道   133035.91  9.052601e+08
220 2017-09-19  首页频道  5189916.89  2.044818e+10
221 2017-09-19  灌水频道   139561.94  9.411479e+08
--------------------
            日期  推广位置        收入         刷新次数
139 2017-08-09  灌水频道  85667.57  458849311.2
            日期  推广位置          收入          刷新次数
100 2017-07-21  首页频道  2670135.54  1.391321e+10
            日期  推广位置          收入          刷新次数
164 2017-08-22  首页频道  4626958.74  1.928316e+10
           日期  推广位置          收入          刷新次数
68 2017-07-05  首页频道  3469926.13  1.427818e+10
            日期  推广位置          收入          刷新次数
124 2017-08-02  首页频道  2861268.48  1.445225e+10
--------------------
            日期  推广位置          收入          刷新次数
214 2017-09-16  首页频道  3690713.27  1.787781e+10
           日期  推广位置       收入         刷新次数
57 2017-06-29  灌水频道  45549.5  261109086.3
            日期  推广位置          收入          刷新次数
158 2017-08-19  首页频道  3370540.67  1.928994e+10
            日期  推广位置         收入         刷新次数
187 2017-09-02  灌水频道  354465.78  923858613.0
           日期  推广位置          收入          刷新次数
24 2017-06-13  首页频道  2038382.66  1.128390e+10
  1. 电影信息存储在csv中,路径为/data/course_data/data_analysis/movie_data.csv;获取导演名字信息并算出一共多少个导演。
import pandas as pd

# 1. 读取数据
movie = pd.read_csv('/data/course_data/data_analysis/movie_data.csv')
# 2. 了解数据的基本信息
print(movie.head())
# 3. 获取导演列信息,并转成list
directors = movie['director_name'].tolist()
# 4. 去重后获取个数
num = set(directors)
print(len(num))

# 输出结果:
(3756, 29)
   Unnamed: 0  color      director_name  num_critic_for_reviews  duration  \
0           0  Color      James Cameron                   723.0     178.0   
1           1  Color     Gore Verbinski                   302.0     169.0   
2           2  Color         Sam Mendes                   602.0     148.0   
3           3  Color  Christopher Nolan                   813.0     164.0   
4           5  Color     Andrew Stanton                   462.0     132.0   

   director_facebook_likes  actor_3_facebook_likes      actor_2_name  \
0                      0.0                   855.0  Joel David Moore   
1                    563.0                  1000.0     Orlando Bloom   
2                      0.0                   161.0      Rory Kinnear   
3                  22000.0                 23000.0    Christian Bale   
4                    475.0                   530.0   Samantha Morton   

   actor_1_facebook_likes        gross  ... num_user_for_reviews language  \
0                  1000.0  760505847.0  ...               3054.0  English   
1                 40000.0  309404152.0  ...               1238.0  English   
2                 11000.0  200074175.0  ...                994.0  English   
3                 27000.0  448130642.0  ...               2701.0  English   
4                   640.0   73058679.0  ...                738.0  English   

  country  content_rating       budget title_year  actor_2_facebook_likes  \
0     USA           PG-13  237000000.0     2009.0                   936.0   
1     USA           PG-13  300000000.0     2007.0                  5000.0   
2      UK           PG-13  245000000.0     2015.0                   393.0   
3     USA           PG-13  250000000.0     2012.0                 23000.0   
4     USA           PG-13  263700000.0     2012.0                   632.0   

  imdb_score aspect_ratio  movie_facebook_likes  
0        7.9         1.78                 33000  
1        7.1         2.35                     0  
2        6.8         2.35                 85000  
3        8.5         2.35                164000  
4        6.6         2.35                 24000  

[5 rows x 29 columns]
1659
3756
发布了35 篇原创文章 · 获赞 4 · 访问量 5285

猜你喜欢

转载自blog.csdn.net/fightingoyo/article/details/105162396
今日推荐