pandas是个强大的数据分析库.
内容(1~3)整理自Pandas官方入门教程.
Pandas有三种主要的数据结构: Series(1D), DataFrame(2D), Panel(3D)
使用之前要导入相关的库:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
1. 创建对象
1.1 创建一个Series对象
s = pd.Series([1,3,5,np.nan,6,8])
创建出来的s为:
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
1.2 创建一个DataFrame对象
dates = pd.date_range('20130101', periods=6) //创建包含6个日期的数组
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
创建出来的df为:
A B C D
2013-01-01 0.469112 -0.282863 -1.509059 -1.135632
2013-01-02 1.212112 -0.173215 0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929 1.071804
2013-01-04 0.721555 -0.706771 -1.039575 0.271860
2013-01-05 -0.424972 0.567020 0.276232 -1.087401
2013-01-06 -0.673690 0.113648 -1.478427 0.524988
2. 查看(View)数据
2.1 查看后N行
df.tail(3)
输出:
A B C D
2013-01-04 0.721555 -0.706771 -1.039575 0.271860
2013-01-05 -0.424972 0.567020 0.276232 -1.087401
2013-01-06 -0.673690 0.113648 -1.478427 0.524988
2.2 查看行键(index) / 列键(columns) / 数据本身(value)
df.index
输出:
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
df.columns
输出:
Index(['A', 'B', 'C', 'D'], dtype='object')
df.values
输出:
array([[ 0.4691, -0.2829, -1.5091, -1.1356],
[ 1.2121, -0.1732, 0.1192, -1.0442],
[-0.8618, -2.1046, -0.4949, 1.0718],
[ 0.7216, -0.7068, -1.0396, 0.2719],
[-0.425 , 0.567 , 0.2762, -1.0874],
[-0.6737, 0.1136, -1.4784, 0.525 ]])
2.3 查看数据的简单统计分析结果(quick statistic summary)
df.describe()
输出:
A B C D
count 6.000000 6.000000 6.000000 6.000000
mean 0.073711 -0.431125 -0.687758 -0.233103
std 0.843157 0.922818 0.779887 0.973118
min -0.861849 -2.104569 -1.509059 -1.135632
25% -0.611510 -0.600794 -1.368714 -1.076610
50% 0.022070 -0.228039 -0.767252 -0.386188
75% 0.658444 0.041933 -0.034326 0.461706
max 1.212112 0.567020 0.276232 1.071804
2.4 对数据排序
df.sort_values(by='B') //默认排序方式为从小到大.
输出:
A B C D
2013-01-03 -0.861849 -2.104569 -0.494929 1.071804
2013-01-04 0.721555 -0.706771 -1.039575 0.271860
2013-01-01 0.469112 -0.282863 -1.509059 -1.135632
2013-01-02 1.212112 -0.173215 0.119209 -1.044236
2013-01-06 -0.673690 0.113648 -1.478427 0.524988
2013-01-05 -0.424972 0.567020 0.276232 -1.087401
3. 选择数据(Selection)
3.1 获取某一列/行的数
df['A']
输出:
2013-01-01 0.469112
2013-01-02 1.212112
2013-01-03 -0.861849
2013-01-04 0.721555
2013-01-05 -0.424972
2013-01-06 -0.673690
Freq: D, Name: A, dtype: float64
df[0:3]
输出:
A B C D
2013-01-01 0.469112 -0.282863 -1.509059 -1.135632
2013-01-02 1.212112 -0.173215 0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929 1.071804
3.2 通过标签(label)来选取数据
df.loc[dates[0]]
输出:
A 0.469112
B -0.282863
C -1.509059
D -1.135632
Name: 2013-01-01 00:00:00, dtype: float64
df.at[dates[0],'A']
输出:
0.46911229990718628
3.3 通过位置(position)来选取数据
df.iloc[3] //选取第三行的数据
输出:
A 0.721555
B -0.706771
C -1.039575
D 0.271860
Name: 2013-01-04 00:00:00, dtype: float64
df.iloc[:,1:3]
输出:
B C
2013-01-01 -0.282863 -1.509059
2013-01-02 -0.173215 0.119209
2013-01-03 -2.104569 -0.494929
2013-01-04 -0.706771 -1.039575
2013-01-05 0.567020 0.276232
2013-01-06 0.113648 -1.478427
4. 有必要掌握的操作
4.1 数据清洗
数据清洗的工作: 处理原始数据中的少量异常数据.
在数据量比较小的时候, 我们可以对缺失值,异常值进行拉格朗日插值法进行插值处理
如果数据样本较充足,我们直接对少量的异常值进行简单粗暴也是最有效的删除
操作步骤
(1) 用pandas读入数据并将之变为DataFrame.
data=pd.DataFrame(pd.read_excel('excel_name.xlsx',index=False))
(2) 用describe()函数简单观察以下数据的总体情况
print(data.describe())
(3) 填充缺失值
data=data.fillna('Missing_Data')
(4) 逐行扫描数据,只要此行存在一个异常值。对此行进行删除。
实例代码如下: (该代码来自这里)
for i in range(data.index.max()):
if any([
'missing' in data.loc[i,:].values,
data.loc[i,'hour'] not in range(25),
data.loc[i,'pressure']>1500,
data.loc[i,'wind_direction']<0 or data.loc[i,'wind_direction']>360,
data.loc[i,'wind_speed']>10,
data.loc[i,'precipitation']>10
]):
print('已删除存在异常值 %s 行数据'%i)
data.drop([i],inplace=True)
(5) 检查一下处理后的数据.
print(data)
print(data.describe())
(6) 确认无误后保存
data.to_csv('cleaned_data.csv')
4.2 数据抽取
要做的事情: 对满足某些条件的数据进行提取操作.
以下内容参考的是这篇文章.
操作步骤
(1) 用pandas读入数据并将之变为DataFrame.
data=pd.DataFrame(pd.read_excel('excel_name.xlsx',index=False))
(2) 设置索引字段
Loandata = loandata.set_index('member_id')
(3) 按列与按列提取信息
loandata.ix[[1303503,1298717],'loan_amnt']
loandata.ix[[1303503,1298717],'loan_amnt'].sum()
(4) 提取特定日期的信息
//先设定好索引字段
loandata = loandata.set_index('issue_d')
//提取所有2016年3月的信息
loandata['2016-03']
(5) 按日期汇总信息
//resample函数可以完成日期的聚合工作
//W表示聚合方式是按周,how表示数据的计算方式,默认是计算平均值,这里设置为sum,进行求和计算。
loandata.resample('W',how=sum).head(10)
如果看着NaN不舒服, 可以用0填充空值, 在语句后面加 .fillna(0) 即可.
4.3 数据可视化
要利用matplotlib 的基础绘图功能
5. pandas相比excel的优势
5.1 处理日期型的数据
如resample函数可以搞定日期的聚合工作.
5.2 接口方面
excel好比是个孤岛. python和其他应用程序的接口更多一些.
5.3 复杂的统计计量方法
excel: 要用VBA(一种宏语言), 非常麻烦.
python: 有很多相关的库可以试用, pandas, statsmodels, numpy等.