十分鐘(小時)學習pandas
十分鐘(小時)學習pandas
一、導語
這篇文章從pandas官網翻譯:鏈接,而且也有很多網友翻譯過,而我為什麽沒去看他們的,而是去官網自己艱難翻譯呢?
畢竟這是一個學習的過程,別人寫的不如自己寫的記憶深刻。那麽開始吧。
1、pandas是什麽?
pandas是基於numpy的數據分析庫(如果你沒了解過numpy,可以在我的博客看numpy相關的文章),提供快速、靈活和富有表現力的數據結構。
pandas的數據結構分為Series(一維)和DataFrame(二維)。這兩個主要的數據結構在金融,統計,社會科學和許多工程領域大展神威。
2、pandas能做什麽?
- 輕松處理丟失的數據(以NaN表示)
- 大小可變性:可以從DataFrame和更高維的對象插入和刪除列
- 自動顯式的數據對齊
- 靈活的按組功能來執行對數據集拆分、聯合操作
- 可輕松地將Python和Numpy數據結構中的不同索引的數據轉換為DataFrame對象
- 可以智能地對大型數據集基於標簽進行切片
- 直觀的合並和連接數據集
- 數據集靈活的重塑和旋轉
- 坐標軸分層標記
- 強大是IO工具:可以從CSV、Excel文件、數據庫加載數據,以及從超快的HDF5格式保存和加載數據
- 時間序列-特定功能:日期範圍生成和頻率轉換
3、導入numpy、pandas庫
import pandas as pd import numpy as np
二、對象的創建
1、創建一個Series:index
s = pd.Series([1,2,3,4],index=list(‘abcd‘))
out:
a 1
b 2
c 3
d 4
dtype: int64
2、創建一個DataFrame
通過numpy數組,並制定日期時間索引和標簽列來創建
dates = pd.date_range(‘20170123‘,periods=6)
print(dates)
df = pd.DataFrame(np.random.randn(6,4),index= dates,columns=list(‘abcd‘))
print(df)
out:
DatetimeIndex([‘2017-01-23‘, ‘2017-01-24‘, ‘2017-01-25‘, ‘2017-01-26‘,
‘2017-01-27‘, ‘2017-01-28‘],
dtype=‘datetime64[ns]‘, freq=‘D‘)
a b c d
2017-01-23 -1.081953 2.547690 0.428435 -2.513003
2017-01-24 -1.123833 -2.080332 0.540281 1.100093
2017-01-25 0.048541 -0.295839 -0.236631 0.107606
2017-01-26 -0.890604 0.408112 0.765936 -0.829474
2017-01-27 -0.845467 2.140932 0.046358 -0.557103
2017-01-28 0.448769 0.584306 -1.892730 -2.223615
通過傳遞一個可以轉換為一系列的對象的字典
df2 = pd.DataFrame({
‘A‘:1,
‘B‘:pd.Timestamp(‘20100123‘),
‘C‘:pd.Series(1,index=list(range(4)),dtype=‘float32‘),
‘D‘:np.array([3] * 4,dtype=‘int32‘),
‘E‘:pd.Categorical([‘test‘,‘train‘,‘test‘,‘train‘]),
‘F‘:‘foobar‘
})
print(df2)
print(‘df2 dtypes:‘)
print(df2.dtypes)
out:
A B C D E F
0 1 2010-01-23 1.0 3 test foobar
1 1 2010-01-23 1.0 3 train foobar
2 1 2010-01-23 1.0 3 test foobar
3 1 2010-01-23 1.0 3 train foobar
df2.dtypes:
A int64
B datetime64[ns]
C float32
D int32
E category
F object
dtype: object
三、查看數據
1、查看數據的頂部和底部的行
df.head(2) #默認為5行
year month day hour season
0 2010.0 5.0 29.0 17.0 1.0
1 2014.0 2.0 15.0 15.0 4.0
df.tail()
year month day hour season
37788 2014.0 1.0 4.0 0.0 4.0
37789 2014.0 4.0 3.0 8.0 1.0
2、顯示索引、列和底層的Numpy數據
- df.index 顯示索引
- df.columns 顯示列名
- df.values 返回的是一個numpy.ndarray類型
3、顯示數據的快速統計摘要
df.describe()
a b c d
count 6.000000 6.000000 6.000000 6.000000
mean -0.574091 0.550811 -0.058059 -0.819249
std 0.658465 1.683878 0.967726 1.374977
min -1.123833 -2.080332 -1.892730 -2.513003
25% -1.034116 -0.119852 -0.165884 -1.875080
50% -0.868035 0.496209 0.237396 -0.693288
75% -0.174961 1.751775 0.512319 -0.058571
max 0.448769 2.547690 0.765936 1.100093
4、翻轉數據
- df.T
5、按軸排序
df2.sort_index(axis=0,ascending=False)
A B C D E F
3 1 2010-01-23 1.0 3 train foobar
2 1 2010-01-23 1.0 3 test foobar
1 1 2010-01-23 1.0 3 train foobar
0 1 2010-01-23 1.0 3 test foobar
6、按值排序
df2.sort_values(by=‘E‘)
A B C D E F
0 1 2010-01-23 1.0 3 test foobar
2 1 2010-01-23 1.0 3 test foobar
1 1 2010-01-23 1.0 3 train foobar
3 1 2010-01-23 1.0 3 train foobar
四、選擇數據
1、通過[‘column_name‘]選擇一個列,得到Series
df[‘A‘] #等效於df.A
2、通過[]切片選擇行
df[‘day‘][:6]
0 29.0
1 15.0
2 6.0
3 5.0
4 25.0
5 26.0
Name: day, dtype: float64
3、基於標簽選擇
.loc屬性是主訪問方法。以下是有效的輸入:
- 單個標簽,例如5或‘a‘(在這裏5被解釋為索引的標簽)
- 標簽的列表或者數組[‘a,‘b‘,‘c‘]
- 具有標簽 ‘b‘:‘e‘的切片對象(註意,這裏與通常的python切片相反,包括開始和停止,他是包括開始和結束的)
- 可以是一個布爾數組
一個callable
s1 = pd.Series(np.random.randn(6),index=list(‘abcdef‘))
out:
a 1.715955
b 0.307930
c -0.971638
d -0.594908
e -3.134987
f 0.396613
dtype: float64
***s1.loc[‘b‘:‘e‘]
out: b 0.307930 c -0.971638 d -0.594908 e -3.134987 dtype: float64
s1.loc[‘b‘]
out: 0.30792993178289157
還可以用來設置value
s1.loc[‘b‘] = 0
out:
a 1.715955
b 0.000000
c -0.971638
d -0.594908
e -3.134987
f 0.396613
dtype: float64
使用在DataFrame
df1 = pd.DataFrame(np.random.randn(6,4),
index = list(‘abcdef‘),
columns=list(‘ABCD‘))
out:
A B C D
a 1.235823 -0.767938 -0.750474 0.342353
b 0.506219 0.388180 0.400716 0.207014
c -0.813548 0.509618 0.311099 -0.645569
d -0.510755 -0.195760 1.162505 -2.125746
e -0.559745 -0.937668 0.363403 0.554602
f -1.512407 0.865061 -0.602054 0.207695
df1.loc[[‘a‘,‘b‘,‘e‘],:]
out:
A B C D
a 1.235823 -0.767938 -0.750474 0.342353
b 0.506219 0.388180 0.400716 0.207014
e -0.559745 -0.937668 0.363403 0.554602
使用標簽獲取行(等效於df.xs(‘a‘))
df1.loc[‘a‘]
out:
A 1.235823
B -0.767938
C -0.750474
D 0.342353
Name: a, dtype: float64
獲取帶有布爾數組的值
df1.loc[‘a‘] > 0
out:
A True
B False
C False
D True
Name: a, dtype: bool
顯示獲取值.loc[‘行標簽‘,‘列標簽‘]
df1.loc[‘a‘,‘A‘]
out:
1.2358232787452161
基於索引的選擇
.iloc屬性可以獲得純粹基於整數的索引。語義準訊python和numpy切片,包括起始便捷,不包括結束邊界。
如果使用的索引是非整數,即使是有效的便簽也會參數IndexError。
以下是.iloc屬性的有效輸入
- 整數,例如7
- 整數列表或者數組,例如[4,2,0]
- 整數的切片(slice)對象,例如1::7
- 一個布爾數組
- 一個callable
s2 = pd.Series(np.random.randn(5),index=list(range(0,10,2)))
out:
0 -1.051477
2 -0.495461
4 2.417686
6 0.329432
8 1.479104
dtype: float64
s2.iloc[:3]
out:
0 -1.051477
2 -0.495461
4 2.417686
6 0.000000
8 1.479104
dtype: float64
s2.iloc[3] = 0 #還可以使用iloc來修改一個的value
out:
0 -1.051477
2 -0.495461
4 2.417686
6 0.000000
8 1.479104
dtype: float64
s2.iloc[:3] = 0 #還是使用iloc連續賦值
out:
0 0.000000
2 0.000000
4 0.000000
6 0.000000
8 1.479104
dtype: float64
使用在DataFrame
df2 = pd.DataFrame(np.random.randn(6,4),
index=list(range(0,12,2)),
columns=list(range(0,8,2)))
out:
0 2 4 6
0 -0.708809 -0.417166 -1.296387 0.620899
2 -1.514339 1.145004 0.877585 -1.695285
4 1.365427 -0.721800 -0.719877 -0.418820
6 0.980937 0.230571 -0.783681 -0.985872
8 1.031649 -1.232232 0.795309 1.294055
10 0.618609 -1.370898 0.229622 0.817530
通過整數切片進行選擇
df2.iloc[:3]
out:
0 2 4 6
0 -0.708809 -0.417166 -1.296387 0.620899
2 -1.514339 1.145004 0.877585 -1.695285
4 1.365427 -0.721800 -0.719877 -0.418820
通過整數列表進行選擇
df2.iloc[[1,3,5],[1,3]]
out:
2 6
2 1.145004 -1.695285
6 0.230571 -0.985872
10 -1.370898 0.817530
df2.iloc[1:3,:] #df2.iloc[:,1:3]
out:
0 2 4 6
2 -1.514339 1.145004 0.877585 -1.695285
4 1.365427 -0.721800 -0.719877 -0.418820
還可以獲得值 .loc[‘行位置‘,‘列位置‘]
df2.iloc[0,1]
out:
-0.41716586227691288
獲取整數位置的行(等於df.xs(1))
df2.iloc[1]
out:
0 -1.514339
2 1.145004
4 0.877585
6 -1.695285
Name: 2, dtype: float64
超出範圍的切片索引,會像python、numpy一樣優雅的處理(pandas v0.14.0之前並不能這樣,否則可能會導致返回一個空的DataFrame)
df2.iloc[:3,:1000]
out:
0 2 4 6
0 -0.708809 -0.417166 -1.296387 0.620899
2 -1.514339 1.145004 0.877585 -1.695285
4 1.365427 -0.721800 -0.719877 -0.418820
超出範圍的單個索引器將生成IndexError(並不能像切片那樣優雅地處理)。任何元素超出邊界的索引器列表將生成IndexError
df2.iloc[[1,2,8]]
IndexError: positional indexers are out-of-bounds
未完待續...
十分鐘(小時)學習pandas