pandas基本数据操作
索引操作
Numpy当中我们已经讲过使用索引选取序列和切片选择,pandas也支持类似的操作,也可以直接使用列名、行名
称,甚至组合使用。
1.1 直接使用行列索引(先列后行)
获取'2018-02-27'这天的'close'的结果
# 直接使用行列索引名字的方式(先列后行)
data['open']['2018-02-27']
23.53
# 不支持的操作
# 错误
data['2018-02-27']['open']
# 错误
data[:1, :2]
1.2 结合loc或者iloc使用索引(先行后列)
获取从'2018-02-27':'2018-02-22','open'的结果
# 使用loc:只能指定行列索引的名字
data.loc['2018-02-27':'2018-02-22', 'open']
2018-02-27 23.53
2018-02-26 22.80
2018-02-23 22.88
Name: open, dtype: float64
# 使用iloc可以通过索引的下标去获取
# 获取前3天数据,前5列的结果
data.iloc[:3, :5]
open high close low
2018-02-27 23.53 25.88 24.16 23.53
2018-02-26 22.80 23.78 23.53 22.80
2018-02-23 22.88 23.37 22.82 22.71
1.3 使用ix组合索引(先行后列)
Warning:Starting in 0.20.0, the
.ix
indexer is deprecated, in favor of the more strict.iloc
and.loc
indexers.
获取行第1天到第4天,['open', 'close', 'high', 'low']这个四个指标的结果
# 使用ix进行下表和名称组合做引
data.ix[0:4, ['open', 'close', 'high', 'low']]
# 推荐使用loc和iloc来获取的方式
data.loc[data.index[0:4], ['open', 'close', 'high', 'low']]
data.iloc[0:4, data.columns.get_indexer(['open', 'close', 'high', 'low'])]
open close high low
2018-02-27 23.53 24.16 25.88 23.53
2018-02-26 22.80 23.53 23.78 22.80
2018-02-23 22.88 22.82 23.37 22.71
2018-02-22 22.25 22.28 22.76 22.02
data.columns.get_indexer()获取索引
赋值操作
对DataFrame当中的close列进行重新赋值为1
# 直接修改原来的值
data['close'] = 1
# 或者
data.close = 1
排序
排序有两种形式,一种对于索引进行排序,一种对于内容进行排序
1. DataFrame排序
- 使用df.sort_values(by=, ascending=)
- 单个键或者多个键进行排序,
- 参数:
- by:指定排序参考的键,可以接受多个值,优先按照第一个值排序,如果相同就按照第二个值排序
- ascending:默认升序
- ascending=False:降序
- ascending=True:升序
# 按照开盘价大小进行排序 , 使用ascending指定按照大小排序
data.sort_values(by="open", ascending=True).head()
- 使用df.sort_index给索引进行排序
这个股票的日期索引原来是从大到小,现在重新排序,从小到大
# 对索引进行排序
data.sort_index()
2. Series排序
- 使用series.sort_values(ascending=True)进行排序
series排序时,只有一列,不需要参数
data['p_change'].sort_values(ascending=True).head()
2015-09-01 -10.03
2015-09-14 -10.02
2016-01-11 -10.02
2015-07-15 -10.02
2015-08-26 -10.01
Name: p_change, dtype: float64
- 使用series.sort_index()进行排序
与df一致
# 对索引进行排序
data['p_change'].sort_index().head()
2015-03-02 2.62
2015-03-03 1.44
2015-03-04 1.57
2015-03-05 2.02
2015-03-06 8.51
Name: p_change, dtype: float64
运算
1. 算术运算
- add(other)
other可以是一个具体的数字,也可以是dataframe中某一列
- sub(other)
2. 逻辑运算
2.1 逻辑运算符号
- 例如筛选data["open"] > 23的日期数据
- data["open"] > 23返回逻辑结果
data["open"] > 23
2018-02-27 True
2018-02-26 False
2018-02-23 False
2018-02-22 False
2018-02-14 False
# 逻辑判断的结果可以作为筛选的依据
data[data["open"] > 23].head()
- 完成多个逻辑判断,
data[(data["open"] > 23) & (data["open"] < 24)].head()
2.2 逻辑运算函数
- query(expr)
- expr:查询字符串
通过query使得刚才的过程更加方便简单
data.query("open<24 & open>23").head()
- isin(values)
例如判断'open'是否为23.53和23.85
# 可以指定值进行一个判断,从而进行筛选操作
data[data["open"].isin([23.53, 23.85])] # 这里isin接受的参数一定要是一个list
3. 统计运算
3.1 describe()
综合分析,可以得出数据的很多统计结果,以columns为一个系列的数据。count
, mean
, std
, min
, max
等
3.2 统计函数
count |
Number of non-NA observations |
---|---|
sum |
Sum of values |
mean |
Mean of values |
median |
Arithmetic median of values,中位数 |
min |
Minimum |
max |
Maximum |
mode |
Mode,出现最多的数 |
abs |
Absolute Value |
prod |
Product of values,乘积 |
std |
Bessel-corrected sample standard deviation,标准差 |
var |
Unbiased variance,方差 |
idxmax |
compute the index labels with the maximum,最大值的索引 |
idxmin |
compute the index labels with the minimum,最小值的索引 |
对于单个函数去进行统计的时候,坐标轴还是按照默认列“columns” (axis=0, default),如果要对行“index” 需要指定(axis=1)
3.3 累计统计函数
函数 | 作用 |
---|---|
cumsum |
计算前1/2/3/…/n个数的和 |
cummax |
计算前1/2/3/…/n个数的最大值 |
cummin |
计算前1/2/3/…/n个数的最小值 |
cumprod |
计算前1/2/3/…/n个数的积 |
自定义运算
-
apply(func, axis=0)
func:自定义函数
axis=0:默认是列,axis=1为行进行运算
定义一个对列,最大值-最小值的函数
data[['open', 'close']].apply(lambda x: x.max() - x.min(), axis=0)
data[['open', 'close']].apply(lambda x: x.max() - x.min(), axis=0)
open 22.74
close 22.85
dtype: float64
pandas画图
1 pandas.DataFrame.plot
DataFrame.plot
(x= None,y = Nonekind='line')x,y label or position
-
kind : str,需要绘制图形的种类
‘line’ : line plot (default)
‘bar’ : vertical bar plot
-
‘barh’ : horizontal bar plot
‘hist’ : histogram 直方图
‘pie’ : pie plot
‘scatter’ : scatter plot
2 pandas.Series.plot
文件读取和存储
1 CSV
1.1 read_csv
- pandas.read_csv(filepath_or_buffer, sep =',', usecols )
- filepath_or_buffer:文件路径
- sep :分隔符,默认用","隔开
- usecols:指定读取的列名,列表形式
- 举例:读取之前的股票的数据
# 读取文件,并且指定只获取'open', 'close'指标
data = pd.read_csv("./data/stock_day.csv", usecols=['open', 'close'])
open close
2018-02-27 23.53 24.16
2018-02-26 22.80 23.53
2018-02-23 22.88 22.82
2018-02-22 22.25 22.28
2018-02-14 21.49 21.92
1.2 to_csv
- DataFrame.to_csv(path_or_buf=None, sep=', ’, columns=None, header=True, index=True, mode='w', encoding=None)
- path_or_buf :文件路径
- sep :分隔符,默认用","隔开
- columns :选择需要的列索引
- header :boolean or list of string, default True,是否写进列索引值
- index : 是否写索引
- mode:'w':重写, 'a' 追加
2.JSON
JSON是我们常用的一种数据交换格式,前面在前后端的交互经常用到,也会在存储的时候选择这种格式。所以我们需要知道Pandas如何进行读取和存储JSON格式。
3.1 read_json
-
pandas.read_json(path_or_buf=None, orient=None, typ='frame', lines=False)
将JSON格式准换成默认的Pandas DataFrame格式
-
orient : string,Indication of expected JSON string format.
-
'split' : dict like {index -> [index], columns -> [columns], data -> [values]}
- split 将索引总结到索引,列名到列名,数据到数据。将三部分都分开了
-
'records' : list like [{column -> value}, ... , {column -> value}]
- records 以
columns:values
的形式输出
- records 以
-
'index' : dict like {index -> {column -> value}}
- index 以
index:{columns:values}...
的形式输出
- index 以
-
'columns' : dict like {column -> {index -> value}}
,默认该格式
- colums 以
columns:{index:values}
的形式输出
- colums 以
-
'values' : just the values array
- values 直接输出值
-
-
lines : boolean, default False
- 按照每行读取json对象
typ : default ‘frame’, 指定转换成的对象类型series或者dataframe
3.3 to_json
- DataFrame.to_json(path_or_buf=None,orient=None,lines=False)
- 将Pandas 对象存储为json格式
- path_or_buf=None:文件地址
- orient:存储的json形式,{‘split’,’records’,’index’,’columns’,’values’}
- lines:一个对象存储为一行
pandas高级处理
1.缺失值
判断是否是否有缺失值:
pd.isnull(df)
会返回一堆的True和False
pd.notnull(df)
经常配合np.any()和np.all()使用。
缺失值的处理
- 删除缺失值
df.dropna()
该函数不会修改原数据,需要接受返回值
- 替换缺失值
fillna(value, inplace=True)
value为需要替换成的值,inplace=True代表会修改原来的数据;False代表不会修改原来的数据,会生成新的数据
如果需要替换所有列的缺失值:
for i in movie.columns:
if np.any(pd.isnull(movie[i])) == False :
movie[i].fillna(value=movie[i].mean(),inplace=True) # 将缺失值替换称为每一列的平均值
- 如果缺失值不是np.NaN,如果是标记'?'
需要先将"?"替换为NaN:df.replace(to_replace,value)
to_replace表示要替换的值,value表示替换成的值
wis = wis.replace(to_replace="?",value=np.NaN)
wis.dropna()
2. 数据离散化
data = df['q_change']
# 自行分组
qcut = pd.qcut(data,q=10) #对data进行分组,q为分成多少组
qcut.value_counts() # 会返回每一个组的元素个数
# 自定义分组区间
bins = [-100,-7,-5,-3,0]
pd.cut(data,bins) # bins是一个list;将data分组,分别是(-100,-7),(-7,-5)...
dummies = pd.get_dummied(qcut,prefix='rise') # 将分好组的数据进行one-hot编码,prefix的意思是是否在每一组的组名之前加上前缀
3. 数据合并
3.1pd.concat([data1,data2],axis=)
该函数实现data1和data2的合并,axis为1或0,1代表按照行索引进行拼接(行index相同的放一行),0代表按照列索引进行拼接
# 按照行索引进行
pd.concat([data, dummies], axis=1)
tips: 这里如果不写axis,拼接会将两个表对角线拼接,也就是data1右边的数据全部变成NaN
3.2pd.merge(left,right,on=None,how='inner')
合并left和right
- on : 指定的共同键
- how:按照什么方式连接,可以是"inner"或者"outer";前者代表内连接,两个表格中key都存在的数据才保留,其他剔除,outer相反,不存在的值填补NaN
例子:
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
# 默认内连接
pd.merge(left, right, on=['key1', 'key2'])
>>
key1 key2A B C D
0 K0 K0 A0 B0 C0 D0
1 K1 K0 A2 B2 C1 D1
2 K1 K0 A2 B2 C2 D2
pd.merge(left, right, on=['key1', 'key2'],how='outer')
>>
key1 key2A B C D
0 K0 K0 A0 B0 C0 D0
1 K0 K1 A1 B1 NaN NaN
2 K1 K0 A2 B2 C1 D1
3 K1 K0 A2 B2 C2 D2
4 K2 K1 A3 B3 NaN NaN
5 K2 K0 NaN NaN C3 D3
4. 数据分组 groupby
-
DataFrame.groupby(key, as_index=False)
- key:分组的列数据,可以多个,是以一个list传进函数的
- as_index=False表示不另外设置新的值为index
groupby分组之后要进行聚合,比如求sum,mean,否则只会返回分组后的分组对象,并没有值
col =pd.DataFrame({'color': ['white','red','green','red','green'], 'object': ['pen','pencil','pencil','ashtray','pen'],'price1':[5.56,4.20,1.30,0.56,2.75],'price2':[4.75,4.12,1.60,0.75,3.15]})
color object price1 price2
0 white pen 5.56 4.75
1 red pencil 4.20 4.12
2 green pencil 1.30 1.60
3 red ashtray 0.56 0.75
4 green pen 2.75 3.15
- 进行分组,对颜色分组,price进行聚合
# 分组,求平均值,以下两种方式都可以,方法一最佳
col.groupby(['color'])['price1'].mean()
col['price1'].groupby(col['color']).mean()
color
green 2.025
red 2.380
white 5.560
Name: price1, dtype: float64
# 分组,数据的结构不变
col.groupby(['color'], as_index=False)['price1'].mean()
color price1
0 green 2.025
1 red 2.380
2 white 5.560