美文网首页我爱编程
pandas一些高效的操作

pandas一些高效的操作

作者: _龙雀 | 来源:发表于2018-01-25 16:12 被阅读409次

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

    1. OneHot编码
    • 生成OneHot编码特征
        actionType = pd.get_dummies(df['actionType'], prefix='actionType', prefix_sep='_')
    
    1. prefix表示OneHote编码特征的命名前缀
    2. 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)
    

    相关文章

      网友评论

        本文标题:pandas一些高效的操作

        本文链接:https://www.haomeiwen.com/subject/rrevaxtx.html