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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章