1. 程式人生 > 實用技巧 >pandas模組篇(之三)

pandas模組篇(之三)

今日內容概要

目標:將Pandas儘量結束

  • 如何讀取外部excel檔案資料到DataFrame中
  • 針對DataFrame的常用資料操作
  • 索引與切片
  • 操作DataFrame的欄位名稱
  • 時間物件序列操作
  • 資料分組與聚合
  • 練習題

今日內容詳細

如何讀取外部excel檔案資料到DataFrame中

df = pd.read_csv('douban_movie.csv')  # 由於當前檔案跟excel檔案在同一個目錄下所以可以直接寫檔名
# 如果不在同一個路徑下 那麼需要輸入excel檔案的絕對路徑
# '''
# 絕對路徑
#     類似於全球具體座標,任何人拿到該座標都可以查詢
# 相對路徑
#     相對於一個參照物,並不是所有人都可以根據該座標找到
# '''
df


# 在讀取檔案的時候還可以自定義列
df1 = pd.read_csv('douban_movie.csv',index_col='產地') 
# df1.set_index('型別')
df1
# 都是用來指定讀取出來的excel資料的左側行名稱(行名稱必須是表格中存在的)

# 將之前設定的行索引取消
df1.reset_index()

基本操作

# 指定看前面多少條
df.head(5)
名字	投票人數	型別	產地	上映時間	時長	年代	評分	首映地點
0	肖申克的救贖	692795.0	劇情/犯罪	美國	1994-09-10 00:00:00	142.0	1994	9.6	多倫多電影節
1	控方證人	42995.0	劇情/懸疑/犯罪	美國	1957-12-17 00:00:00	116.0	1957	9.5	美國
2	美麗人生	327855.0	劇情/喜劇/愛情	義大利	1997-12-20 00:00:00	116.0	1997	9.5	義大利
3	阿甘正傳	580897.0	劇情/愛情	美國	1994-06-23 00:00:00	142.0	1994	9.4	洛杉磯首映
4	霸王別姬	478523.0	劇情/愛情/同性	中國大陸	1993-01-01 00:00:00	171.0	1993	9.4	香港
        
# 檢視尾部指定條數的資料
df.tail(5)

# 檢視資料條數
len(df)
38735

# 檢視資料的行列個數
df.shape
(38735, 9)

# 檢視行索引
df.index
RangeIndex(start=0, stop=38735, step=1)

# 檢視列欄位
df.columns
Index(['名字', '投票人數', '型別', '產地', '上映時間', '時長', '年代', '評分', '首映地點'], dtype='object')

資料匯出

# 將DataFrame匯出excel檔案
df.to_csv('db1.csv')  # 預設index=True 自動將DataFrame的行索引也匯出


df.to_csv('db2.csv',index=False)  # 忽略行索引

索引與切片

DataFrame也是由行索引和列索引,也可以通過標籤和位置兩種方法進行
方式1
	兩個中括號,先取列再取行  df['A'][0]
方式2
	使用loc/iloc屬性:一箇中括號逗號隔開,先取行再取列
   	都是左側
    
df.loc[0:5]
名字	投票人數	型別	產地	上映時間	時長	年代	評分	首映地點
0	肖申克的救贖	692795.0	劇情/犯罪	美國	1994-09-10 00:00:00	142.0	1994	9.6	多倫多電影節
1	控方證人	42995.0	劇情/懸疑/犯罪	美國	1957-12-17 00:00:00	116.0	1957	9.5	美國
2	美麗人生	327855.0	劇情/喜劇/愛情	義大利	1997-12-20 00:00:00	116.0	1997	9.5	義大利
3	阿甘正傳	580897.0	劇情/愛情	美國	1994-06-23 00:00:00	142.0	1994	9.4	洛杉磯首映
4	霸王別姬	66666666.0	劇情/愛情/同性	中國大陸	1993-01-01 00:00:00	171.0	1993	9.4	香港
5	泰坦尼克號	157074.0	劇情/愛情/災難	美國	2012-04-10 00:00:00	194.0	2012	9.4	中國大陸
df.iloc[0:5]
名字	投票人數	型別	產地	上映時間	時長	年代	評分	首映地點
0	肖申克的救贖	692795.0	劇情/犯罪	美國	1994-09-10 00:00:00	142.0	1994	9.6	多倫多電影節
1	控方證人	42995.0	劇情/懸疑/犯罪	美國	1957-12-17 00:00:00	116.0	1957	9.5	美國
2	美麗人生	327855.0	劇情/喜劇/愛情	義大利	1997-12-20 00:00:00	116.0	1997	9.5	義大利
3	阿甘正傳	580897.0	劇情/愛情	美國	1994-06-23 00:00:00	142.0	1994	9.4	洛杉磯首映
4	霸王別姬	66666666.0	劇情/愛情/同性	中國大陸	1993-01-01 00:00:00	171.0	1993	9.4	香港

資料操作

df['名字']  # 展示形式是Series

df[['名字']]  # 用中括號擴一下就會變成表格的形式展示

# 一次性獲取多個列
df[['名字','評分','型別']]

# 切片獲取資料條數
df[0:10]

# 獲取指定資料
df.at[4,'名字']  # at['行索引值','列名稱']
# 修改指定資料
df.at[4,'名字'] = '愛情動作科幻大混合'
# 利用關鍵字指定索引
df.loc[1].at['名字']


# 切片之後獲取指定的列資料
df[1:5][['名字','型別','年代']]


# 資料快速篩選
df[(df.評分 > 8.5) & (df.評分 < 9.0)]

資料自定義展示

>>> df = pd.DataFrame({
...     'col1': ['A', 'A', 'B', np.nan, 'D', 'C'],
...     'col2': [2, 1, 9, 8, 7, 4],
...     'col3': [0, 1, 9, 4, 2, 3],
... })
>>> df
    col1 col2 col3
0   A    2    0
1   A    1    1
2   B    9    9
3   NaN  8    4
4   D    7    2
5   C    4    3

Sort by col1
>>> df.sort_values(by=['col1'])
    col1 col2 col3
0   A    2    0
1   A    1    1
2   B    9    9
5   C    4    3
4   D    7    2
3   NaN  8    4

Sort by multiple columns

>>> df.sort_values(by=['col1', 'col2'])
    col1 col2 col3
1   A    1    1
0   A    2    0
2   B    9    9
5   C    4    3
4   D    7    2
3   NaN  8    4
Sort Descending

>>> df.sort_values(by='col1', ascending=False)
    col1 col2 col3
4   D    7    2
5   C    4    3
2   B    9    9
0   A    2    0
1   A    1    1
3   NaN  8    4
Putting NAs first

>>> df.sort_values(by='col1', ascending=False, na_position='first')
    col1 col2 col3
3   NaN  8    4
4   D    7    2
5   C    4    3
2   B    9    9
0   A    2    0
1   A    1    1

# 後面還可以對排序之後的結果篩選
df.sort_values(['列名1','列名2'],ascending=True)[['目標列1','目標列2']]

操作列

df.rename(column={'舊列名稱':'新列名稱'},inplace=True)
# 能修改 但是會報個錯誤 可以新增下列配置
pd.set_option('mode.chained_assignment',None)


# 建立新的列
df['新列名稱']=df.列名稱/(df.列名稱1+df.列名稱2)

# 自定義位置
df.insert(3,'新列名稱',新資料)

操作行

# 方式1 append
>>> df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
>>> df
   A  B
0  1  2
1  3  4
>>> df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))

>>> df.append(df2)
   A  B
0  1  2
1  3  4
0  5  6
1  7  8
With `ignore_index` set to True:
    
>>> df.append(df2, ignore_index=True)
   A  B
0  1  2
1  3  4
2  5  6
3  7  8



# 方式2 concat功能更強大  可以拼接Series和DataFrame
pd.concat([res,df])
pd.concat([res,df],ignore_index=True)
'''
本質其實就相當於拼接表格資料
'''