我爱编程

pandas一些高效的操作

2018-01-25  本文已影响409人  _龙雀

记录一些学习到的pandas操作技巧,能大大精简代码

1. OneHot编码
    actionType = pd.get_dummies(df['actionType'], prefix='actionType', prefix_sep='_')
  1. prefix表示OneHote编码特征的命名前缀
  2. prefix_sep表示连接前缀与特征值的符号,默认为下划线
    生成的特征名例如:“actionType_1”
        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)
上一篇下一篇

猜你喜欢

热点阅读