一、创建 pandas 对象
1.Pandas数据结构Series
Series 对象可以理解为一维数组
1.1普通初始化
import pandas as pd
import numpy as np
s = pd.Series([1, 3, 5, np.nan, 6, 8]) #nan代表这个数字未被赋值
print(s)
'''
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
'''
1.2指定index
pandas会默认用0到n-1来作为Series的index,但是我们也可以自己指定index。index我们可以把它理解为dict里面的key。
import pandas as pd
import numpy as np
s = pd.Series([7,'BJ',2.17,-1212,'SH'],index = ['A','B','C','D','E'])
print(s)'''
A 7
B BJ
C 2.17
D -1212
E SH
dtype: object
'''
1.3 利用字典构造Series
还可以用dictionary来构造一个Series,因为Series本来就是key value pairs。
import pandas as pd
import numpy as np
cities = {'BJ':55000,'SH':50000,'SZ':55000,'GZ':49999}
s = pd.Series(cities,name = 'price')
print(s)
'''
BJ 55000
SH 50000
SZ 55000
GZ 49999
Name: price, dtype: int64
'''
1.4 numpy ndarray构建一个Series
np.random.randn():通过本函数可以返回一个或一组服从标准正态分布的随机样本值。
np.random.rand():一个或者一组服从0-1均匀分布的随机样本值
import pandas as pd
import numpy as np
s =pd.Series(np.random.randn(5),index = ['A','B','C','D','E'])
print(s)
'''
A -0.715958
B 0.627240
C -0.351149
D -0.805255
E -0.865477
dtype: float64
'''
2.Pandas数据结构DataFrame
一个Dataframe就是一张表格,Series表示的是一维数组,Dataframe则是一个二维数组,可以类比成一张excel的spreadsheet。也可以把Dataframe当做一组Series的集合。
2.1 普通创建
- 设置行标签和列标签
- DataFrame 对象可以理解为二维数组,可以指定索引格式。
- 查看数值
import pandas as pd
import numpy as np
#设置行标签和列标签
dates = pd.date_range('2019-01-01',periods = 6)#创建时间序列,起点是2019-01-01,长度为6
#columns列,指定索引格式
data = pd.DataFrame(np.random.randn(6,4),index = dates,columns = list('ABCD'))
print(data)
print(data.values)#查看数值
'''
A B C D
2019-01-01 -0.961455 0.765434 1.756497 -1.862825
2019-01-02 2.662467 -0.913085 -1.588741 1.242044
2019-01-03 -1.219130 1.623460 0.167301 -0.057764
2019-01-04 0.953770 0.386012 -0.798798 -0.419125
2019-01-05 0.318219 1.523670 -1.083251 -0.074676
2019-01-06 0.774675 1.049923 -0.719318 -0.792782
[[-0.96145549 0.76543408 1.75649738 -1.86282533]
[ 2.66246701 -0.91308539 -1.58874101 1.24204403]
[-1.2191298 1.62346005 0.16730121 -0.0577638 ]
[ 0.9537699 0.3860123 -0.79879835 -0.4191248 ]
[ 0.31821941 1.52367012 -1.08325141 -0.07467571]
[ 0.77467467 1.04992279 -0.71931795 -0.7927819 ]]
'''
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']})
'''
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
'''
- 查看格式
print(df.dtypes)
'''
A int64
B datetime64[ns]
C int64
D int64
E object
F object
dtype: object
'''
- 查看某列数据
print(df.A)
'''
0 1
1 1
2 1
3 1
Name: A, dtype: int64
'''
二.查看数据
obj.shape #查看数据结构 >>>(6, 4)
obj.head(3) #查看前三行数据;不加参数时,默认前5行
obj.tail(2) #查看后两行数据;不加参数时,默认后5行
obj.index #查看行标签
obj.columns #查看列标签
obj.values #只查看数据
obj.describe() #查看列数据的个数、平均值、最大值等信息
obj.T #矩阵的转置 df.T.shape >>> (4, 6)
obj.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
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']#效果同上,效率更高,必须要有时间戳,必须要有clo参数
# df.at['2016-03-01', 'A'] will raise error
2.通过位置选择
iloc 和loc的区别—>iloc按位置,loc按标签
loc和at区别:at是点,loc可以点也可以区域
df.iloc[1] #选择第二行的所有数据
df.iloc[2:5, 0:2] #选择第三行到五行,第一列到第二列的数据
df.iloc[1:5, :] #选择第二行到第五行的所有数据
df.iloc[1, 1] #选择第二行第二列的数据
df.iat[1, 1] #选择第二行第二列的数据,效率更高
at和iat需要行列两个坐标参数,用于选择某个‘点’,loc可以选择区域也可以选择点。
3.布尔索引
df[df > 0] #选择所有大于0的数据
df[df.A < 0] #选择A列数据中小于0的数据
四、修改数据
添加新的列
data['TAG'] = ['a']*2 +['b']*3 + ['c']
print(data)
>>>
A B C D TAG
2019-01-01 -1.234104 -0.339820 0.202076 0.214571 a
2019-01-02 0.140410 1.205496 -1.236103 0.490686 a
2019-01-03 -0.500527 0.636590 1.686169 0.249639 b
2019-01-04 -1.232453 2.574547 -0.562229 -0.455986 b
2019-01-05 -0.436278 0.081140 0.443555 -0.880121 b
2019-01-06 -0.330511 -0.906138 -0.291127 -0.187305 c
data[data.TAG.isin(['a','c'])] #用'a','c'过滤
>>>
A B C D TAG
2019-01-01 -1.234104 -0.339820 0.202076 0.214571 a
2019-01-02 0.140410 1.205496 -1.236103 0.490686 a
2019-01-06 -0.330511 -0.906138 -0.291127 -0.187305 c
修改一列
data.A = range(6)
A B C D TAG
2019-01-01 0 -0.339820 0.202076 0.214571 a
2019-01-02 1 1.205496 -1.236103 0.490686 a
2019-01-03 2 0.636590 1.686169 0.249639 b
2019-01-04 3 2.574547 -0.562229 -0.455986 b
2019-01-05 4 0.081140 0.443555 -0.880121 b
2019-01-06 5 -0.906138 -0.291127 -0.187305 c
修改一个区域
data.iloc[:,2:5] = 1000
A B C D TAG
2019-01-01 0 -0.339820 1000 1000 1000
2019-01-02 1 1.205496 1000 1000 1000
2019-01-03 2 0.636590 1000 1000 1000
2019-01-04 3 2.574547 1000 1000 1000
2019-01-05 4 0.081140 1000 1000 1000
2019-01-06 5 -0.906138 1000 1000 1000
修改某一个数据
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的数取反