python数据清洗/预处理 如何打基础

提醒自己应该学什么。这篇博客作为长期的任务0001

刚刚接触人工智能,机器学习,深度学习的朋友,可能都会比较看重算法部分,一旦在教程中看到了数据的处理也都将其简单看看就匆匆带过了。如果之前没有很好地基础的话,到真正拿到数据的时候,很难灵活的按照自己的需要将数据进行清洗。

在网上直接找到的pandas的教程,一般都不会有实际应用中的问题那么灵活。所以需要自己的在刻意的补一下基础。

1. pandas的使用

    pandas doc        

   

2. 文本处理

   正则表达式         官方API       字符串相关的处理函数       使用案例1    python正则表达式详解

3. 实际的找典型的数据清洗的代码,记录他们的清洗中用到的知识点

-----001.  数据清洗代码 寒老师(NLP类型的数据) cPickle数据存储load和dump          from collections import defaultdict字典用于给每一个词分配一个独立的数字进行表示Word作为key,数字作为value      sys用于处理路径     join函数将list连成一个字符串       split函数分割          set用于将分割后的字符去掉重复值     字典里存储label、原始输入、词数统计、split      文件打开文件一行行读取并处理    strip()字符串去除左右端空格      dict里面统计所有的词并变成数字,同时还要将词存在一个list里面方便使用    正则表达式       re.sub对于搜索到的字符串,用另一字符串replacement替换。返回替换后的字符串。    比如以后我想清理时想删除所有数字,或者只保留所有数字也可以使用正则表达式

-----002.  2018腾讯广告算法大赛baseline 线上0.73    

pandas读取文件     

os.path.exists(''../data/userFeature_'')判断某文件是否存在

字符串的split和join多次组合制作dict的key和value(虽然简单,但不单独说出来,初学者可能也没有这个意识直接这么写啊┓( ´∀` )┏)

pd.read_csv('..')读取feature

user_feature.to_csv('../data/userFeature_' + str(cnt) + '.csv', index=False)存文件时如何合理的命名

user_feature = pd.concat([pd.read_csv('../data/userFeature_' + str(i) + '.csv') for i in range(cnt + 1)]).reset_index(drop=True)  concat原来不止是两个,多个名字类似的文件应该这样concat

数据较大时可以存成多个csv,读取成df,然后concat,再存成一个大csv。以后考虑这样做好在哪,就多一个思路。

读取文件都自己写了程序叫get_data。用exist分两种情况,有的时候read_csv,没有的时候从头开始制作

表里面的label不是你想要的,就用这个方法更改train.loc[train['label']==-1,'label']=0

pd.concat([train,predict])

pd.merge(data,ad_feature,on='aid',how='left')

data.fillna('-1')填充Nan

删除某一个dataframe 用del user_feature

one-hot应该怎么写?import什么包,词放进list里, for循环list,LabelEncoder().fit_transform还得搭配个try-except

dataframe的这几个操作。

train=data[data.label!=-1]

train_y=train.pop('label')   train和label分开了。

test=data[data.label==-1]

enc = OneHotEncoder()  enc.fit(data[feature].values.reshape(-1, 1))

train_x= sparse.hstack((train_x, train_a))

 cv=CountVectorizer()-for feature in vector_feature: - cv.fit(data[feature])- cv.transform( train[feature])

#数据分片处理,对每片分别训练预测,然后求平均如何实现看代码

-----003. IJCAI-18 阿里妈妈搜索广告转化预测亚军解决方案       BRYAN大神IJCAI-18比赛思路详解   

天池比赛汇总   时间是将一天分为48个时间段。

(1)df.apply(f)将一列作为f的参数时不加axis或者写axis = 0;将一行作为参数时写axis=1; df['..]加上列名则只对这一列操作,不加列名则对所有列都进行操作  这个操作用来每一行记录的处理,如统计某一个格里面有几个更小的概念。对时间进行拆分,日期,小时,48个数代表的时间段各成一列。axis = 1的时候可以综合统计同一个id的记录里面存放在不同列的数据;axis = 0的时候可以综合统计整个一列的分布情况,或者去重后总共有多少值。如何往apply的function里面存储多个参数

data_df['remark'].apply(segment_sentence, args=(word_list,)

 

(2)reduce对参数序列中元素进行累积。

  (3) pd.concat ----将多个df放进list中。确认好取交集还是并集,axis = 0纵向拼接,axis = 1横向拼接    keys参数是用来给list中的不同df做标记的,方便以后 区分开。

(4)len([i for i in reduce((lambda x, y: x + y), [i.split(':')[1].split(',') for i in x.split(';') if len(i.split(':'))>1]) if i != '-1'])如果一个value被分成了好几个层次,先是用;分,再是用冒号分,最后又用逗号分。然后想要求他们的累加值的话,依然可以一行搞定。关于list的加法:['456','ctt']+['wer','wer','ue']输出为['456', 'ctt', 'wer', 'wer', 'ue']  可见就相当于把多个list合并成一个list.  所以这个方法再统计property这种层次很复杂的数据的时候会使用,目的是求得property的总数。

(5)字符串的join。一个原本打乱了顺序的字符串,里面可能有多个有顺序的小概念,将大字符串逐层的分解,再sorted排序,之后再join。起到的作用:原来是一个字符串,我还保持你是一个字符串,只是顺序调整一下。

(6)sorted  排序的意思,再数据清洗上可以用来将一系列事件如query按照一个固定顺序来排列。具体是什么意图,可能有些事件本身就有先后顺序,然后字符串上又能体现出来,这个时候用sorted就很有用。    sorted([['456','ctt'],['234','ctt'],['wer','wer','ue']])输出为[['234', 'ctt'], ['456', 'ctt'], ['wer', 'wer', 'ue']]  也可以用于统计出一个广告出现最多的属性,按照出现次数将属性排列,再将钱1,2,3,4,5,10个join成不同的feature。

(7)pd.merge   merge,join,concat好难想明白各种情况该选择哪个。  ①merge用于将原始df以及按行统计出的新feature结合在一起  ②t_data = pd.merge(data, user, on='user_id').reset_index(drop=True)  user是data中将user_id提取出来,data和user进行merge会产生什么效果:原本data表里面是一个user_id对应好几行,现在应该是一个user_id对应一行了。等以后自己用时测试一下。这样用的目的就是将同一个user的信息整合到一起。

(8) LabelEncoder 用整数表示类;OneHotEncoder用one-hot表示类。都是用于表示类别的。一般是在数据清洗完毕之后,在补全类所有分类之后再对各个feature转化成数字。LabelEncoder先fit,再transform.

enc=LabelEncoder()
enc.fit(data['instance_id'].values)
data['instance_id']=enc.transform(data['instance_id'])

df列,简单的用fit_transform 操作就好。

def encode(data):
    id_features=['shop_id', 'item_id', 'user_id', 'item_brand_id', 'item_city_id', 'user_gender_id','item_property_list', 'predict_category_property',
                      'user_occupation_id', 'context_page_id','top1','top2','top3','top4','top5','top10','query1','query','cate']
    for feature in id_features:
        data[feature] = LabelEncoder().fit_transform(data[feature])
    return data

(9) 排名用groupby加rank; full feature多达200多个特征。

(10)df按某一列或几列进行排序data = data.sort_values(by=['user_id', 'context_timestamp']).reset_index(drop=True)

-----004. 天池直播有很多的讲解

天池历届大赛答辩PPT及视频

-----005.  遇到的问题

(1)dataframe读取完之后,既有空值,又有int,还有float.导致想将整个列变成float,则空值不能满足,将整个列变成string 时float不可以。在Pandas中更改列的数据类型【方法总结】   pd.to_numeric(s, errors='coerce')

(2)将某一列的数据类型统一更改:df = pd.DataFrame(data=d, dtype=np.int8)

(3)df怎么复制 DataFrame.copy(deep=True)

(4)df在从文件中导入时如何确定每一列的数据类型    对于刚收集来的数据最好还是先以object类型读取比较好,容易进行类型转换。

(5)选择非空的行   # df为需要筛选的数据框,col为选择非空依赖的列 df = df[(df[col].notnull) & (df[col] != "")]

(6) pandas如何把dataframe中的值进行排序  sorted_values+pandas Dataframe按指定列值排序问题df.sort_values(by="sales" , ascending=False)       DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')

(7)划窗统计。data['sum_Times']=data['Times'].groupby(['userID']).cumsum()

-----006. pandas的绘制    present_year[:10].plot(kind='bar', stacked=True)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值