pandas和numpy的区别
numpy对数据进行了序列化, pandas在numpy的基础上对数据进行了字典化.
在pandas中, 一维数据的创建(带有字典型索引的ndarray)
import pandas as pd
import numpy as np
array = pd.Series(data, index, dtype, name, copy)
# data 可以是array-like型(list, tuple, dict【如果是字典型,就不应带index参数】), 以及其他iterable类型
# index 可以是array-like型或1d的index型
# name 就是这个数据的名字, 不能作为key, 只是说明数据
# copy boolean型, 是否从输入拷贝数据, 如果为False, 当修改data数据时, array数据也会被修改
创建和属性
pandas 的亲儿子是DataFrame类, 构造函数如下
df = pd.DataFrame(data, index, columns, dtype, copy)
# 其他和series相似, 多了一个columns参数, 可以对列命名, 并用这个命名索引
# columns和index 的参数类型一样, 都是array-like 或index类
用ndarray创建dataframe:
dates = pd.date_range('20190101', periods=6)
dates
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
'2019-01-05', '2019-01-06'],
dtype='datetime64[ns]', freq='D')
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df
A | B | C | D | |
---|---|---|---|---|
2019-01-01 | -0.484616 | -0.248309 | -0.098313 | -0.683003 |
2019-01-02 | 1.505606 | 0.510335 | 1.113863 | -0.734523 |
2019-01-03 | -1.465088 | -0.735197 | 1.016585 | -0.354663 |
2019-01-04 | -0.250029 | 0.398673 | -0.098441 | -0.873569 |
2019-01-05 | -1.778377 | 0.134948 | -0.239482 | -0.740788 |
2019-01-06 | 0.862918 | 0.666206 | -0.435106 | 0.643491 |
用字典创建DataFrame:
df2 = pd.DataFrame({ 'A' : 1.,
'B' : pd.Timestamp('20190102'),
'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' : 'foo' })
df2
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
0 | 1.0 | 2019-01-02 | 1.0 | 3 | test | foo |
1 | 1.0 | 2019-01-02 | 1.0 | 3 | train | foo |
2 | 1.0 | 2019-01-02 | 1.0 | 3 | test | foo |
3 | 1.0 | 2019-01-02 | 1.0 | 3 | train | foo |
DataFrame有一些常用属性或方法:
df.index # 返回行索引
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
'2019-01-05', '2019-01-06'],
dtype='datetime64[ns]', freq='D')
df.columns # 返回列索引
Index(['A', 'B', 'C', 'D'], dtype='object')
df.values # 返回所有值
array([[ 0.64661672, 1.33378913, -1.66105168, -0.79864461],
[ 0.11228697, 1.61794145, -2.08530885, -0.79313203],
[-1.58538998, 1.51130963, 0.18998638, -0.95260641],
[-0.51939052, 0.29940983, -0.41711038, 0.35637944],
[ 2.99021982, 0.33903874, -0.48491081, -0.96314392],
[ 0.5022305 , -0.78227386, -1.73768114, -0.8378494 ]])
df.dtypes # 返回所有列的数据类型
A float64
B float64
C float64
D float64
dtype: object
df.describe()# 返回数据的统计值, 包括中位数, 平均值, 标准差等
A | B | C | D | |
---|---|---|---|---|
count | 6.000000 | 6.000000 | 6.000000 | 6.000000 |
mean | 0.357762 | 0.719869 | -1.032679 | -0.664833 |
std | 1.525755 | 0.936810 | 0.913651 | 0.505763 |
min | -1.585390 | -0.782274 | -2.085309 | -0.963144 |
25% | -0.361471 | 0.309317 | -1.718524 | -0.923917 |
50% | 0.307259 | 0.836414 | -1.072981 | -0.818247 |
75% | 0.610520 | 1.466930 | -0.434060 | -0.794510 |
max | 2.990220 | 1.617941 | 0.189986 | 0.356379 |
df.sort_index(axis=1, ascending = False)# 按照索引排序, axis=[0, 1], 按行索引或列索引
D | C | B | A | |
---|---|---|---|---|
2019-01-01 | -0.798645 | -1.661052 | 1.333789 | 0.646617 |
2019-01-02 | -0.793132 | -2.085309 | 1.617941 | 0.112287 |
2019-01-03 | -0.952606 | 0.189986 | 1.511310 | -1.585390 |
2019-01-04 | 0.356379 | -0.417110 | 0.299410 | -0.519391 |
2019-01-05 | -0.963144 | -0.484911 | 0.339039 | 2.990220 |
2019-01-06 | -0.837849 | -1.737681 | -0.782274 | 0.502230 |
df.sort_values(by='D',axis=0, ascending=False) # 按照值排序, by是排序的键, axis和键对应, 要是键是列名,则是在行上调整,
# axis=0, 若键是行名, 在列上调整, axis=1
A | B | C | D | |
---|---|---|---|---|
2019-01-04 | -0.519391 | 0.299410 | -0.417110 | 0.356379 |
2019-01-02 | 0.112287 | 1.617941 | -2.085309 | -0.793132 |
2019-01-01 | 0.646617 | 1.333789 | -1.661052 | -0.798645 |
2019-01-06 | 0.502230 | -0.782274 | -1.737681 | -0.837849 |
2019-01-03 | -1.585390 | 1.511310 | 0.189986 | -0.952606 |
2019-01-05 | 2.990220 | 0.339039 | -0.484911 | -0.963144 |
选择
选择方法有.at, .iat, .loc, .iloc,.ix, 按列,切片,按条件等。所有带i的方法是用的行列序号, 不带的用的行列的索引键
基本取值
df.A
2019-01-01 0.646617
2019-01-02 0.112287
2019-01-03 -1.585390
2019-01-04 -0.519391
2019-01-05 2.990220
2019-01-06 0.502230
Freq: D, Name: A, dtype: float64
df['A']
2019-01-01 0.646617
2019-01-02 0.112287
2019-01-03 -1.585390
2019-01-04 -0.519391
2019-01-05 2.990220
2019-01-06 0.502230
Freq: D, Name: A, dtype: float64
df[0:3]
A | B | C | D | |
---|---|---|---|---|
2019-01-01 | 0.646617 | 1.333789 | -1.661052 | -0.798645 |
2019-01-02 | 0.112287 | 1.617941 | -2.085309 | -0.793132 |
2019-01-03 | -1.585390 | 1.511310 | 0.189986 | -0.952606 |
df['20190104':'20190106']
A | B | C | D | |
---|---|---|---|---|
2019-01-04 | -0.519391 | 0.299410 | -0.417110 | 0.356379 |
2019-01-05 | 2.990220 | 0.339039 | -0.484911 | -0.963144 |
2019-01-06 | 0.502230 | -0.782274 | -1.737681 | -0.837849 |
通过标签索引选择
df.loc['20190102']
A 0.112287
B 1.617941
C -2.085309
D -0.793132
Name: 2019-01-02 00:00:00, dtype: float64
df.loc[:, ['A','B']]
A | B | |
---|---|---|
2019-01-01 | 0.646617 | 1.333789 |
2019-01-02 | 0.112287 | 1.617941 |
2019-01-03 | -1.585390 | 1.511310 |
2019-01-04 | -0.519391 | 0.299410 |
2019-01-05 | 2.990220 | 0.339039 |
2019-01-06 | 0.502230 | -0.782274 |
df.loc[:,'A':'C']
A | B | C | |
---|---|---|---|
2019-01-01 | 0.646617 | 1.333789 | -1.661052 |
2019-01-02 | 0.112287 | 1.617941 | -2.085309 |
2019-01-03 | -1.585390 | 1.511310 | 0.189986 |
2019-01-04 | -0.519391 | 0.299410 | -0.417110 |
2019-01-05 | 2.990220 | 0.339039 | -0.484911 |
2019-01-06 | 0.502230 | -0.782274 | -1.737681 |
df.at[dates[0], 'A']
0.6466167158704922
按位置选择
df.iloc[0, :]
A 0.646617
B 1.333789
C -1.661052
D -0.798645
Name: 2019-01-01 00:00:00, dtype: float64
df.iloc[1:2, [0, 3]]
A | D | |
---|---|---|
2019-01-02 | 0.112287 | -0.793132 |
df.iat[1,1]
1.6179414481667929
按照布尔条件选择
df[df.A > 0.6]
A | B | C | D | |
---|---|---|---|---|
2019-01-01 | 0.646617 | 1.333789 | -1.661052 | -0.798645 |
2019-01-05 | 2.990220 | 0.339039 | -0.484911 | -0.963144 |
df.B[df.A > 0.6]
2019-01-01 1.333789
2019-01-05 0.339039
Name: B, dtype: float64
赋值
在上述选择的基础上直接赋值即可。
添加列
通过对新列索引赋值的方式,添加新列, 用Series添加时,需要用index和原有表对齐
df['F'] = np.nan
df['G'] = pd.Series(np.random.randn(6), index=dates)
丢失数据的处理
dropna(how)
:按照how 的方式丢弃含有nan的条目,how=[‘any’,‘all’]
fillna(value)
:对nan填充value值
isna(dataFrame)
返回布尔类型的遮罩,nan的项为True
Apply方法
dp.apply(func)
此处的func可以是已有的方法,例如np.cumsum,也可以是lambda表达式
df.apply(np.cumsum, axis=1)
A | B | C | D | F | G | |
---|---|---|---|---|---|---|
2019-01-01 | -0.484616 | -0.732925 | -0.831239 | -1.514241 | NaN | -2.174741 |
2019-01-02 | 1.505606 | 2.015942 | 3.129805 | 2.395282 | NaN | 3.739866 |
2019-01-03 | -1.465088 | -2.200285 | -1.183701 | -1.538364 | NaN | -1.934477 |
2019-01-04 | -0.250029 | 0.148644 | 0.050203 | -0.823366 | NaN | -2.273726 |
2019-01-05 | -1.778377 | -1.643429 | -1.882911 | -2.623698 | NaN | -4.758681 |
2019-01-06 | 0.862918 | 1.529125 | 1.094018 | 1.737509 | NaN | 2.837270 |
df.apply(lambda x: x.max()-x.min())
A 3.283983
B 1.401404
C 1.548970
D 1.517059
F NaN
G 3.479566
dtype: float64
导入、导出数据
支持多种格式的读取和写入
read_csv, read_excel, read_pickel
to_csv, to_excel, to_pickel
表合并
pandas提供了多种以不同的集合操作合并pandas数据类型(Series,dataframe,panel)的工具,主要的两种是concat和merge
concat([ ], axis, join,ignore_index ...)
: 第一个参数是要合并的表构成的列表,axis是方向,join={‘inner’, ‘outer’},默认是outer,即取并集,缺少的部分用NaN填充,ignore_index为True时,意味着将表合并后重新编index,否则当纵向合并时,索引会重复。
merge
:sql风格的合并