pandas一些高效的操作
2018-01-25 本文已影响409人
_龙雀
记录一些学习到的pandas操作技巧,能大大精简代码
1. OneHot编码
- 生成OneHot编码特征
actionType = pd.get_dummies(df['actionType'], prefix='actionType', prefix_sep='_')
- prefix表示OneHote编码特征的命名前缀
- prefix_sep表示连接前缀与特征值的符号,默认为下划线
生成的特征名例如:“actionType_1”
- 批量选择OneHot编码特征
df['actionType_{}'.format(column)] #column表示列的编号
2. 时间戳转为标准本地时间格式
时间戳:从 1970 年 1 月 1 日 00:00:00 到现在的秒数
先定义一个转换操作的方法
import time
def time_conv(x):
timeArray=time.localtime(x)
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
return otherStyleTime
再利用pandas中Series格式内置的map方法将该操作应用到每一行
df.Time = pd.to_datetime(df.Time.map(lambda x: time_conv(x)),format="%Y-%m-%d %H:%M:%S")
例如:1503443585 转化为 2017-08-23 07:13:05
3. 特征数值化
df['province'] = df['province'].map(list(df['province'].unique()).index)
特征1 | province | 特征2 |
---|---|---|
江西 | ||
重庆 | ||
上海 | ||
重庆 |
按上面代码操作,特征集里的province列则替换为
特征1 | province | 特征2 |
---|---|---|
0 | ||
1 | ||
2 | ||
1 |
4. 数据分组聚合过程中agg模块的使用
- 使用内置的标准聚合函数
df = DataFrame({'key1':['a','a','b','b','a'],'key2':['one','two','one','two','one'],
'data1':np.random.randn(5),'data2':np.random.randn(5)})
#生成一个dataframe表
grouped = df[['data1','data2']].groupby(df['key1'])['data1'].agg({'key1_count':'count','data1_mean':'mean'})
#以key1为关键字进行分组,统计分组后的key1值的个数和data1的平均值
#使用字典进行重命名,'count'、'mean'为内置的标准操作函数
标准操作函数有:
count | 分组中非NA值得数量 |
---|---|
sum | 非NA值得和 |
mean | 非NA值得平均值 |
median | 非NA值得算术中位数 |
std、var | 无偏(分母为n-1)标准差和方差 |
min、max | 非NA值得最小值和最大值 |
prod | 非NA值的积 |
first、last | 第一个和最后一个非NA值 |
- 自定义的聚合函数
def func(arr):
return arr.max() - arr.min()
grouped = df[['data1','data2']].groupby(df['key1'])['data1'].agg({'max-min':func})
#利用自定义的func求得按key1得到的分组中每一组data1值的的最大值减最小值
#使用字典进行重命名
5. applymap函数的运用
applymap与上面做特征数值化运用的map类似,前者是针对DataFrame,后者针对Series
例如定义一个将空值设置为0的func函数
def func(x):
try:
return float(x)
except:
if x == 'NaN':
return 0
else:
return x
使用applymap方法对dataframe表中每一个值调用该函数
data.applymap(func) #与data.fillna(0,inplace=True)基本等价
6. 选取类别型的特征与数值型的特征
cate_columns = data.select_dtypes(include=['object']).columns
num_columns = data.select_dtypes(exclude=['object']).columns
pandas中针对dataframe内置了select_dtypes函数!!!
7. 删除列的三种方式
del data[列名]
del data.列名
data.drop(['列名'], axis=1, inplace=True)
data.drop([[列的编号]], axis=1)
8. 修改列名
df.rename(columns={'old列名1':'new列名1','old列名2':'new列名2'},inplace=True)
9. 组内排序
df_sorted = df.groupby('userid',as_index=False).apply(lambda x:x.sort_values('orderTime', ascending=False)) #按最近的时间开始排序
#userid表示Dataframe中用来分组的特征
#orderTime:表示Dataframe表中用来排序的特征
10. 使用lambda遍历dataframe行
def func(x,y):
return x - y
#df里面有两列名为x和y
df['x-y'] = df.apply(lambda row: func(row['x'], row['y'] ), axis=1)