pandas常見用法總結
阿新 • • 發佈:2018-12-13
前言
Pandas是一個開放原始碼的Python庫,它使用強大的資料結構提供高效能的資料操作和分析工具。這篇文章以例項方式介紹了pandas的常見用法。
匯入
# pandas一般會與numpy配合使用
import pandas as pd
import numpy as np
DataFrame
由一系列的Series組成
# Series是DataFrame的一列
series_1 = pd.Series(1, 2, "3", "a") # 建立Serise,它會自動給每個元素加上索引值,從0開始
series_1.index = ["a" ,"b","c","d"] # 修改索引值
series_1.drop["a"] # 刪
series_1["a"] = 4 # 改
series_1["a"] # 查
檢視資訊
# a是一個DataFrame
a.info() # 顯示資料資訊:列名、非空數量、資料型別等。
a.describe() # 可以得到數值型資料的一些分佈
a.head() # 顯示資料(一般顯示前5行,可以在括號中指定顯示幾行)
a.tail() # 顯示後幾行資料
a.columns # 顯示列名
a.shape # 顯示形狀
建立一列資料
s = pd.Series([1,np.nan,44])
print(s)
0 1.0
1 NaN
2 44.0
dtype: float64
建立一個數據表
df = pd.DataFrame(np.random.randn(6,4)) # 有索引
print(df)
0 1 2 3
0 -0.485819 1.465311 -0.874580 -0.801833
1 -1.195040 0.438705 -0.152660 -0.896882
2 0.601379 0.871732 -0.232300 -1.942046
3 -1.467846 0.985194 0.802487 1.073567
4 1.137115 1.414391 -0.194927 0.145966
5 0.403413 1.570771 1.883406 -0.559665
構建一個時間序列:從20181212開始的6天
dates = pd.date_range('20181212', periods=6)
print(dates)
DatetimeIndex(['2018-12-12', '2018-12-13', '2018-12-14', '2018-12-15',
'2018-12-16', '2018-12-17'],
dtype='datetime64[ns]', freq='D')
構建一個有行名有列名的表
# index是用上述的時間序列作為行名,columns是列名
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=['a','b','c','d'])
print(df)
a b c d
2018-12-12 -0.408206 0.690151 -0.255535 -0.825533
2018-12-13 -0.782994 0.846120 -2.369437 -0.563946
2018-12-14 0.592621 0.642034 0.631633 0.470060
2018-12-15 -1.716559 0.687173 -2.644728 0.084093
2018-12-16 0.010821 -0.669383 0.484277 -0.455398
2018-12-17 -0.686960 0.171372 0.501168 0.651696
輸出上表的資料型別
print(df.dtypes)
a float64
b float64
c float64
d float64
dtype: object
輸出上表的行名和列名
print(df.index) # 輸出行名
DatetimeIndex(['2018-12-12', '2018-12-13', '2018-12-14', '2018-12-15',
'2018-12-16', '2018-12-17'],
dtype='datetime64[ns]', freq='D')
print(df.columns) # 輸出列名
Index(['a', 'b', 'c', 'd'], dtype='object')
排序
print(df)
# axis=1是對第2個維度(列名)排序;axis=0是對第1個維度(行名)排序。
# ascending=False為倒序排序,預設為True正序。
print(df.sort_index(axis=1, ascending=False))
a b c d
2018-12-12 -0.806089 0.660987 -0.137833 -0.724158
2018-12-13 -0.375285 -1.071433 -1.046819 0.414112
2018-12-14 0.377175 -0.751585 0.197294 0.048427
2018-12-15 -0.872873 0.154589 -0.225713 0.713596
2018-12-16 -0.028886 1.199271 0.306876 -0.268253
2018-12-17 -1.468384 -0.105490 1.179329 -1.655588
d c b a
2018-12-12 -0.724158 -0.137833 0.660987 -0.806089
2018-12-13 0.414112 -1.046819 -1.071433 -0.375285
2018-12-14 0.048427 0.197294 -0.751585 0.377175
2018-12-15 0.713596 -0.225713 0.154589 -0.872873
2018-12-16 -0.268253 0.306876 1.199271 -0.028886
2018-12-17 -1.655588 1.179329 -0.105490 -1.468384
# 對特定的列排序
print(df.sort_values(by='a', ascending=True))
a b c d
2018-12-17 -1.468384 -0.105490 1.179329 -1.655588
2018-12-15 -0.872873 0.154589 -0.225713 0.713596
2018-12-12 -0.806089 0.660987 -0.137833 -0.724158
2018-12-13 -0.375285 -1.071433 -1.046819 0.414112
2018-12-16 -0.028886 1.199271 0.306876 -0.268253
2018-12-14 0.377175 -0.751585 0.197294 0.048427
索引1
dates = pd.date_range('20181212',periods=6)
df = pd.DataFrame(np.arange(24).reshape([6,4]),index=dates, columns=['A','B','C','D'])
print(df)
A B C D
2018-12-12 0 1 2 3
2018-12-13 4 5 6 7
2018-12-14 8 9 10 11
2018-12-15 12 13 14 15
2018-12-16 16 17 18 19
2018-12-17 20 21 22 23
print(df['A']) # 同 df.A,檢索到特定一列
2018-12-12 0
2018-12-13 4
2018-12-14 8
2018-12-15 12
2018-12-16 16
2018-12-17 20
Freq: D, Name: A, dtype: int32
# 切片操作
print(df[0:3]) # 同 df['20181212':'20181214'],索引或者行名都可以
A B C D
2018-12-12 0 1 2 3
2018-12-13 4 5 6 7
2018-12-14 8 9 10 11
檢索2
df.loc和df.iloc的用法:
print(df)
A B C D
2018-12-12 0 1 2 3
2018-12-13 4 5 6 7
2018-12-14 8 9 10 11
2018-12-15 12 13 14 15
2018-12-16 16 17 18 19
2018-12-17 20 21 22 23
# df.loc:以行名、列名檢索
print(df.loc['20181213']) # 檢索到特定一行
A 4
B 5
C 6
D 7
Name: 2018-12-13 00:00:00, dtype: int32
print(df.loc[:,['A','B']]) # 所有行的A、B列
A B
2018-12-12 0 1
2018-12-13 4 5
2018-12-14 8 9
2018-12-15 12 13
2018-12-16 16 17
2018-12-17 20 21
print(df.loc['20181212',['A','B']]) # 20181212行的A、B列
A 0
B 1
Name: 2018-12-12 00:00:00, dtype: int32
# df.iloc:以索引號(從0開始)檢索
print(df.iloc[3]) # 第三行
A 12
B 13
C 14
D 15
Name: 2018-12-15 00:00:00, dtype: int32
print(df.iloc[3,1]) # 第三行的第一列
13
print(df.iloc[3:5,1:3]) # 3-5行的1-3列
B C
2018-12-15 13 14
2018-12-16 17 18
print(df[df.A > 12]) # 找出A列大於12的行
A B C D
2018-12-16 16 17 18 19
2018-12-17 20 21 22 23
修改元素值
dates = pd.date_range('20181212',periods=6)
df = pd.DataFrame(np.arange(24).reshape([6,4]),index=dates, columns=['A','B','C','D'])
print(df)
A B C D
2018-12-12 0 1 2 3
2018-12-13 4 5 6 7
2018-12-14 8 9 10 11
2018-12-15 12 13 14 15
2018-12-16 16 17 18 19
2018-12-17 20 21 22 23
df.iloc[2,2] = 2222 # 將第二行第二列元素值改為2222
print(df)
A B C D
2018-12-12 0 1 2 3
2018-12-13 4 5 6 7
2018-12-14 8 9 2222 11
2018-12-15 12 13 14 15
2018-12-16 16 17 18 19
2018-12-17 20 21 22 23
df.loc['20181214','B'] = 6666 # 按行名列名改
A B C D
2018-12-12 0 1 2 3
2018-12-13 4 5 6 7
2018-12-14 8 6666 2222 11
2018-12-15 12 13 14 15
2018-12-16 16 17 18 19
2018-12-17 20 21 22 23
df[df.A>6]=222 # 把A列中所有大於6的行的值變為222
print(df)
A B C D
2018-12-12 0 1 2 3
2018-12-13 4 5 6 7
2018-12-14 222 222 222 222
2018-12-15 222 222 222 222
2018-12-16 222 222 222 222
2018-12-17 222 222 222 222
df.B[df.A>3]=999 # 再把A中所有大於3的B列值變為999
print(df)
A B C D
2018-12-12 0 1 2 3
2018-12-13 4 999 6 7
2018-12-14 222 999 222 222
2018-12-15 222 999 222 222
2018-12-16 222 999 222 222
2018-12-17 222 999 222 222
df['F'] = np.nan #新增一列 全為NaN
print(df)
A B C D F
2018-12-12 0 1 2 3 NaN
2018-12-13 4 999 6 7 NaN
2018-12-14 222 999 222 222 NaN
2018-12-15 222 999 222 222 NaN
2018-12-16 222 999 222 222 NaN
2018-12-17 222 999 222 222 NaN
df['E'] = [1,2,3,4,5,6] # 再新增一列,給定值
print(df)
A B C D F E
2018-12-12 0 1 2 3 NaN 1
2018-12-13 4 999 6 7 NaN 2
2018-12-14 222 999 222 222 NaN 3
2018-12-15 222 999 222 222 NaN 4
2018-12-16 222 999 222 222 NaN 5
2018-12-17 222 999 222 222 NaN 6
NaN
pandas中缺失資料用NaN來表示。
dates = pd.date_range('20181212',periods=3)
df = pd.DataFrame(np.arange(12).reshape([3,4]),index=dates, columns=['A','B','C','D'])
df.iloc[0,1] = np.nan
df.iloc[1,3] = np.nan
print(df)
A B C D
2018-12-12 0 NaN 2 3.0
2018-12-13 4 5.0 6 NaN
2018-12-14 8 9.0 10