首先导入模块,并加载数据集到python中:
import pandas as pd
import numpy as np
feature_data = pd.read_csv('./fusai_data/feature_data_2017_3456_7.csv',dtype={'link_ID':str})
dtype是指定某列的数据类型。
其他参数有 index_col=”ID”,指定索引。
1 – 布尔索引
如果需要以某几列数据值为条件过滤数据
选取5月8点的数据
train5 = feature_data.loc[(feature_data.time_interval_month == 5)&
(feature_data.time_interval_begin_hour==8),:]
解析:第一维是行索引,第二维是列索引。这里的布尔索引的针对行的,表示满足条件的所有行;而列是“:”,表示选取所有的列,如果是特定的几列,可以用用[link_ID, travel_time]替换“:”部分。
2-查看dataframe的固有信息
(1)查看有哪些列
train5.column
(2)查看列的数据类型
train5.dtypes
(3)查看列的缺省值数量
train5.isnull().sum()
结果:
(1)
Index(['link_ID', 'length', 'width', 'link_class', 'time_interval_begin',
'time_interval_year', 'time_interval_month', 'time_interval_day',
'time_interval_begin_hour', 'time_interval_minutes',
'time_interval_week', 'travel_time', 'mean_58', 'median_58', 'mode_58'],
dtype='object')
(2)
link_ID object
length int64
width int64
link_class int64
time_interval_begin object
time_interval_year int64
time_interval_month int64
time_interval_day int64
time_interval_begin_hour int64
time_interval_minutes int64
time_interval_week int64
travel_time float64
mean_58 float64
median_58 float64
mode_58 float64
dtype: object
其中,object表示的是string类型或非数值类型。
(3)
link_ID 0
length 0
width 0
link_class 0
time_interval_begin 0
time_interval_year 0
time_interval_month 0
time_interval_day 0
time_interval_begin_hour 0
time_interval_minutes 0
time_interval_week 0
travel_time 0
mean_58 12991
median_58 12991
mode_58 12991
dtype: int64
3-填补缺失值
fillna()就可以解决,比如填固定值-9999
train5 = train5.fillna(-9999)
or
train5.fillna(-9999,inplace=True)
其中,inplace=True表示就地填充。
4-深拷贝
import copy
train5_tmp = copy.deepcopy(train5)
如果train5_tmp的值改变,train5相应位置的值不改变。
5-DataFrame与numpy.array的相互转换
(1)DataFrame转numpy.array
arr = train5.values
(2)numpy.array转DataFrame
arr_pd = pd.DataFrame(arr)
6-数据透视,有点像groupby的意思
train5.pivot_table( values=["travel_time"], index=['time_interval_week','time_interval_month'], aggfunc=np.mean)
结果
travel_time
time_interval_week time_interval_month
1 5 19.967901
2 5 19.275360
3 5 19.876924
4 5 19.813867
5 5 20.429607
6 5 15.951253
7 5 14.088380
7-pandas里面的统计信息
np.random.seed(1234)
d1 = pd.Series(2*np.random.normal(size = 100)+3)
d2 = np.random.f(2,4,size = 100)
d3 = np.random.randint(1,100,size = 100)
d1.count() #非空元素计算
d1.min() #最小值
d1.max() #最大值
d1.idxmin() #最小值的位置,类似于R中的which.min函数
d1.idxmax() #最大值的位置,类似于R中的which.max函数
d1.quantile(0.1) #10%分位数
d1.sum() #求和
d1.mean() #均值
d1.median() #中位数
d1.mode() #众数
d1.var() #方差
d1.std() #标准差
d1.mad() #平均绝对偏差
d1.skew() #偏度
d1.kurt() #峰度
d1.describe() #一次性输出多个描述性统计指标
8-column names 重命名
(1)train5.columns = ['a', 'b', 'c', 'e', 'd', 'f'] # 重命名
(2)train5.rename(columns = {'A':'aa','B':'bb', 'C':'cc', 'D':'dd', 'E':'ee', 'F':'ff'}, inplace=True)
(3)train5.rename(columns=lambda x: x[1:].upper(), inplace=True) # 也可以用函数 inplace参数的意思就是代替原来的变量,深拷贝
9-value_counts, 统计每个数值出现的个数
pd.value_counts(train5['time_interval_minutes'])
结果:
44 3895
58 3892
30 3891
32 3890
46 3885
56 3880
40 3872
36 3871
54 3869
34 3869
28 3867
24 3863
48 3861
42 3861
38 3859
20 3859
26 3848
18 3842
50 3842
22 3838
16 3831
52 3828
4 3824
14 3822
6 3822
8 3819
12 3813
10 3810
2 3802
0 3787
10-删除列和行
(1)列
train5.drop(['time_interval_month'],inplace=True,axis=1)
or
del train5['time_interval_week']
(2)行,删除索引为1和3的行
train5.drop(train5.index[[1,3]],inplace=True)
11-pop某一列
'time_interval_begin'从train5中删除,并赋值给train_time:
train_time = train5.pop('time_interval_begin')
12- one-hot编码
(1)根据列'time_interval_week'生成哑变量week,并把week添加到原DataFrame里面去。
week = pd.get_dummies(feature_data['time_interval_week'],prefix='week')
del train5['time_interval_week']
train5 = pd.concat([train5,week],axis=1)
(2)将train5中所有非数值变量转化成哑变量
train5_onehot = pd.get_dummies(train5)
13-筛选
(1) df[(df.A >= -1) & (df.B <= 0)] # 值筛选
(2) df[df.E.str.contains(">")] # 包含某个字符,contains筛选的其实是正则表达式
(3) df[df.F.isin(['1'])] # 在列表内
14-数据选择
(1) train5['A'] # 单个的列
(2) train5[0:3] # 行
(3) train5.loc[:5,] #(等同train5.loc[:5,:]),index筛选
(4) train5.loc[train5.time_interval_day==10,:]
(5) train5.iloc[:,] # iloc只能用数字了
15-给DataFrame添加一列
例如:给train5新添加一列'travel_time_new'
train5['travel_time_new'] = train5_tmp['travel_time'].values
注意:
这样赋值的前提是:
(1)train5的行数要和等号右边的行数一样多。
(2)train5_tmp['travel_time']最好加上.values,因为可能train5_tmp经过一系列操作索引更改了,那么可能Series 元素索引顺序与train5索引不一致,导致赋值混乱!
参考文献:
(1)Python数据处理:Pandas模块的 12 种实用技巧:
http://python.jobbole.com/85742/
(2)Python基于pandas的数据处理(一):
http://www.cnblogs.com/big-face/p/5418416.html
(3)Python数据分析之pandas学习:
http://www.cnblogs.com/nxld/p/6058591.html
最后一个强烈推荐!