文章目錄
一、創建數據集對象
1.Pandas數據結構Series
Series 對象可以理解爲一維數組
1.1 普通初始化
s = pd.Series([1, 3, 5, np.nan, 6, 8])
s
>>>
0 1
1 3
2 5
3 NaN
4 6
5 8
dtype: float64
1.2 指定index
pandas會默認用0到n-1來作爲Series的index,但是我們也可以自己指定index。index
我們可以把它理解爲dict
裏面的key
。
s = pd.Series([7, 'Beijing', 2.17, -12344, 'Happy Birthday!'],
index=['A', 'B', 'C', 'D', 'E'])
s
>>>
A 7
B Beijing
C 2.17
D -12344
E Happy Birthday!
dtype: object
1.3 利用字典構造Series
還可以用dictionary來構造一個Series,因爲Series本來就是key value pairs。
cities = {'Beijing': 55000, 'Shanghai': 60000, 'Shenzhen': 50000, 'Hangzhou': 20000, 'Guangzhou': 25000, 'Suzhou': None}
apts = pd.Series(cities, name="price")
apts
>>>
Beijing 55000.0
Shanghai 60000.0
Shenzhen 50000.0
Hangzhou 20000.0
Guangzhou 25000.0
Suzhou NaN
Name: price, dtype: float64
1.4 numpy ndarray構建一個Series
s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
s
>>>
a -1.480891
b 0.315682
c 0.109896
d -0.963698
e 0.834620
dtype: float64
2.Pandas數據結構DataFrame
一個Dataframe就是一張表格,Series表示的是一維數組,Dataframe則是一個二維數組,可以類比成一張excel的spreadsheet。也可以把Dataframe當做一組Series的集合。
2.1 普通創建
- 設置行標籤和列標籤
dates = pd.date_range('20160301', periods=6)
dates
>>>
DatetimeIndex(['2016-03-01', '2016-03-02', '2016-03-03', '2016-03-04',
'2016-03-05', '2016-03-06'],
dtype='datetime64[ns]', freq='D')
DataFrame 對象可以理解爲二維數組
,可以指定索引格式。
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df
>>>
A B C D
2016-03-01 -0.779271 -0.156312 -1.567857 -1.173683
2016-03-02 0.621355 0.403143 -0.233806 0.090319
2016-03-03 -0.441081 -0.231066 -0.395750 -0.566691
2016-03-04 -0.220860 1.570879 -0.532439 -0.574232
2016-03-05 -0.301826 -0.268013 0.176482 -0.932393
2016-03-06 0.013857 1.134069 0.992023 0.179226
- 查看數值
df.values
2.2 使用字典來創建
使用字典來創建:key 爲 DataFrame 的列;value 爲對應列下的值
df = pd.DataFrame({
'A': 1,
'B': pd.Timestamp('20160301'),
'C': range(4),
'D': np.arange(5, 9),
'E': 'text',
'F': ['AA', 'BB', 'CC', 'DD']})
df
>>>
A B C D E F
0 1 2016-03-01 0 5 text AA
1 1 2016-03-01 1 6 text BB
2 1 2016-03-01 2 7 text CC
3 1 2016-03-01 3 8 text DD
- 查看格式
df.dtypes
- 查看某列數據
df.A
>>>
0 1
1 1
2 1
3 1
Name: A, dtype: int64
二、查看數據
- 創建數據集
n_rows = 6
dates = pd.date_range('20160301', periods=n_rows)
df = pd.DataFrame(np.random.randn(n_rows, 4), index=dates, columns=list('ABCD'))
df
>>>
A B C D
2016-03-01 0.819810 -0.152730 -1.177506 0.301507
2016-03-02 -2.243868 0.027009 -1.294775 -0.080856
2016-03-03 -1.410188 -0.255301 -0.282580 -2.253302
2016-03-04 -0.373900 -1.076556 -0.193431 0.771121
2016-03-05 -0.461388 -0.404523 1.015933 -2.771721
2016-03-06 0.125354 1.777238 0.350636 -1.049762
- 查看
df.shape #查看數據結構 >>>(6, 4)
df.head(3) #查看前三條數據
df.tail(2) #查看後兩條數據
df.index #查看行標籤
df.columns #查看列標籤
df.values #只查看數據
df.describe() #查看數據的個數、平均值、最大值等信息
df.T #矩陣的轉置 df.T.shape >>> (4, 6)
df.sort_index(axis=1, ascending=False) #按照列標籤降序,ascending=True爲升序;
axis=0,按照行標籤降序
axis=1是跨行,axis=0是跨列
df.sort_values(by='C') #根據C列數據排序,默認升序
三、數據選擇
df['A'] #選擇A列數據
df[2:4] #選擇第三行到第四行的數據,和python切片的規則一樣
df['20160302':'20160305'] #依據時間選擇數據
1.通過標籤選擇
df.loc['20160301']
>>>
A 1.313419
B 0.826457
C -1.574146
D 0.525008
Name: 2016-03-01 00:00:00, dtype: float64
type(df.loc['20160301'])
>>>
pandas.core.series.Series
df.loc[:, ['A', 'B']] #選擇A、B列的所有數據
df.loc['20160301':'20160305', ['A', 'B']] #選擇20160301--20160305之間,A、B兩列的數據
df.loc['2016-03-01', 'A'] #2016-03-01這天A的數據
df.at[pd.Timestamp('2016-03-01'), 'A']
#效果同上
# df.at['2016-03-01', 'A'] will raise error
2.通過位置選擇
df.iloc[1] #選擇第二行的所有數據
df.iloc[2:5, 0:2] #選擇第三行到五行,第一列到第二列的數據
df.iloc[1:5, :] #選擇第二行到第五行的所有數據
df.iloc[1, 1] #選擇第二行第二列的數據
df.iat[1, 1] #選擇第二行第二列的數據
3.布爾索引
df[df > 0] #選擇所有大於0的數據
df[df.A < 0] #選擇A列數據中小於0的數據
>>>
A B C D
2016-03-02 -2.243868 0.027009 -1.294775 -0.080856
2016-03-03 -1.410188 -0.255301 -0.282580 -2.253302
2016-03-04 -0.373900 -1.076556 -0.193431 0.771121
2016-03-05 -0.461388 -0.404523 1.015933 -2.771721
df['tag'] = ['a'] * 2 + ['b'] * 3 + ['c'] #添加新的列
>>>
A B C D tag
2016-03-01 0.819810 -0.152730 -1.177506 0.301507 a
2016-03-02 -2.243868 0.027009 -1.294775 -0.080856 a
2016-03-03 -1.410188 -0.255301 -0.282580 -2.253302 b
2016-03-04 -0.373900 -1.076556 -0.193431 0.771121 b
2016-03-05 -0.461388 -0.404523 1.015933 -2.771721 b
2016-03-06 0.125354 1.777238 0.350636 -1.049762 c
df[df.tag.isin(['a', 'c'])] #用'a','c'過濾
>>>
A B C D tag
2016-03-01 0.819810 -0.152730 -1.177506 0.301507 a
2016-03-02 -2.243868 0.027009 -1.294775 -0.080856 a
2016-03-06 0.125354 1.777238 0.350636 -1.049762 c
四、修改數據
df
>>>
A B C D tag
2016-03-01 0.819810 -0.152730 -1.177506 0.301507 a
2016-03-02 -2.243868 0.027009 -1.294775 -0.080856 a
2016-03-03 -1.410188 -0.255301 -0.282580 -2.253302 b
2016-03-04 -0.373900 -1.076556 -0.193431 0.771121 b
2016-03-05 -0.461388 -0.404523 1.015933 -2.771721 b
2016-03-06 0.125354 1.777238 0.350636 -1.049762 c
- 添加新的列
s = pd.Series(np.arange(6),index=pd.date_range('20160302', periods=6))
s
>>>
2016-03-02 0
2016-03-03 1
2016-03-04 2
2016-03-05 3
2016-03-06 4
2016-03-07 5
Freq: D, dtype: int32
df['E'] = s
df
>>>
A B C D tag E
2016-03-01 0.819810 -0.152730 -1.177506 0.301507 a NaN
2016-03-02 -2.243868 0.027009 -1.294775 -0.080856 a 0.0
2016-03-03 -1.410188 -0.255301 -0.282580 -2.253302 b 1.0
2016-03-04 -0.373900 -1.076556 -0.193431 0.771121 b 2.0
2016-03-05 -0.461388 -0.404523 1.015933 -2.771721 b 3.0
2016-03-06 0.125354 1.777238 0.350636 -1.049762 c 4.0
- 修改某一個數據
df.loc['20160301', 'A'] = 0.2
# df.['20160301', 'A'] = 0.2 will not have effect
df.at[pd.Timestamp('20160301'), 'A'] = 0.4
df.iat[0, 0] = 0.6
df.loc[:, 'A'] = np.arange(10, 16) #修改A列所有數據
df2 = df.loc[:, ['B', 'C']].copy()
df2[df2 > 0] = -df2 #將所有大於0的數取反