文章目录
一、创建数据集对象
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的数取反