加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

pandas数据处理

发布时间:2020-12-14 04:55:14 所属栏目:大数据 来源:网络整理
导读:用pandas进行数据分析,对数据预处理,以及简单例子说明 concat 用于将2个DataFrame连接到一起,一般是将训练集与测试集连接在一起对属性值进行预处理 。个人感觉这样处理是可以的,因为对属性值的处理一般要求数值越多越好,而且对训练集与测试集的数据预处

用pandas进行数据分析,对数据预处理,以及简单例子说明

  • concat

用于将2个DataFrame连接到一起,一般是将训练集与测试集连接在一起对属性值进行预处理。个人感觉这样处理是可以的,因为对属性值的处理一般要求数值越多越好,而且对训练集与测试集的数据预处理要求要是一样的。只要在训练模型的时候讲2者分开就行。

相同列合并到一起,不同时新建列,缺省值为NaN

df1 =DataFrame({'a':[1,2,3],'b':[4,5,6]})

print df

"""

0? 1?? 4? NaN

2? 3?? 6? NaN

1? b NaN??? f

df.reset_index(inplace=True)

0????? 0? 1??4? NaN

2????? 2? 3??6? NaN

4????? 1? b NaN???f

df.drop('index',axis=1,inplace=True)

4? b NaN??? f

df =df.reindex_axis(df1.columns,axis=1)

0? 1?? 4

2? 3?? 6

4 ?b NaN

df.shape[0],df.shape[1]分别获取行数、列数

print "Row count:",df.shape[0]

"""

"""?

  • map()

Series 或 DataFrame 的列都可以调用一个map()方法。该方法接受一个函数或字典作为参数,并将之应用于该列的每一个元素,将元素值映射为另一个值。多用于数据离散化。

0? 0? 1? 1

2? 4? 5? 5

也可以在原来列修改值。df['a'] =df['a']. map({xxx})

0? 1? 1

2? 5? 5

lambda函数也可以用自定义函数实现

当元素值少时,可以直接用字典修改:

?? a?????? b

1? 1? female

  • ?isin()
  • 判断某一列元素是否属于列表里的元素,返回True False列表,如果为True,则对该行元素进行操作,False时不操作

    0??????cc??????? c

    2???????c??????? e

    对于一列数字,要获取平均值,如下:

    median =df.a.dropna().median()

    median: 3.0

    对于一列非数字,例如字符,要找到出现频率最高的字符赋值给missing值

    freq_max =df2.c.dropna().mode().values

    试了下,如果求列c,各频率相同,则返回空列表

    • ?属性数字化----枚举

    某一属性,其值表示为字符,且范围较少时,可选择使用枚举进行数字化

    用np.unique()生成唯一化后的元素,在用enumerate()生成对应元组,转化为列表后生成字典。再对字典进行map操作,即可实现数值化。

    print'unique_value:',unique_value

    for i in dict.keys():

    c : 2

    df2.aa = df2.aa.map(lambdax:dict[x]).astype(int)

    ?? aa dd

    1?? 1? e

    """

    • 哑变量

    作用条件与枚举类似,属性值范围不大时,会为每一个值生成新的一列。结果需要concat

    print'dummy_df_column1:n',dummy_df_column1

    ?? aa? bb? cc

    1?? 0?? 1?? 0

    dummy_df_column1 =dummy_df_column1.rename(columns=lambda x : 'dummy_'+str(x))

    ??dummy_aa? dummy_bb? dummy_cc

    1????????0???????? 1???????? 0

    df =pd.concat([df,dummy_df_column1],0)">? column1column2? dummy_aa? dummy_bb?dummy_cc

    1?????bb????? ee???????? 0???????? 1???????? 0

    每个属性值对应一列,所以属性值很多的情况下不适用,会生成较大的df。将哑变量变换后的新的属性列直接concat到原来的df中即可。

    • ?loc()

    loc()对应列选取多行,第一个元素取行,第二个元素对应列,默认情况下为所有列

    2? 3? 7

    print df.loc[(df.a.values> 2),'a'] #只作用于a列,输出a列

    3??? 4

    df.loc[(df.a.values >2),'a'] = 2 #对其赋值,则改变df的值

    0? 1? 5

    2? 2? 7

    ?bining面元组合

    主要用于产生一个有序分类

    ?? aa? bb

    1?? 2?? 3

    3?? 6?? 7

    5? 10? 11

    7? 14? 15

    先用pd.qcut()将数据分为若干份,对应新的一列,元素为一个范围字符串,仍然需要量化

    0???? [0,7]

    5??? (7,0)">6??? (7,0)">7??? (7,0)">Name: aa,dtype: category

    print pd.qcut(df.bb,4)

    1????? [1,0)">2????? (4.5,8]

    5???? (8,0)">6??? (11.5,15]

    此处是均等分为2份或4份,实际数据中当数值并非均匀分布时,生成的bining应该不是均匀分布

    还有就是貌似qcut几份有最大值限制,我实验的时候貌似最大只能分到9,配置为10则出错。想到分太多维太占用内存,这点也可以理解了。

    0?? 0?? 1??[0,7]?? [1,0)">1?? 2?? 3??[0,0)">2?? 4?? 5??[0,0)">3?? 6?? 7??[0,0)">4?? 8?? 9? (7,14]? (8,0)">5? 10? 11? (7,0)">6? 12? 13? (7,0)">7? 14? 15? (7,10)">

    分类后元素只是string,还要进行数字化,可以采用enumerate,dummy,factorize。

    """

    1?? 2?? 3????????????1????????????? 0

    3?? 6?? 7????????????1????????????? 0

    5? 10? 11????????????0????????????? 1

    7? 14? 15????????????0????????????? 1

    这部分没玩起来,不知道怎么回事啊? ???

    cc_dict = {key:value for value,key in cc_enumerate}

    ??? printkey,cc_dict[key]

    df['cc'] = df.cc.map(lambdax:cc_dict[x]).astype(int)

    ?factorize() 实验了一把,主要是将列表中字母值用枚举表示,相同值用同一数字。 结果只生成一列,可以在原来列中操作,后面的参数[0]不可去掉或改为其他值,原因暂时我也不知道

    df.column1 =pd.factorize(df.column1)[0]

    ??column1? column2

    1???????1??????? 1

    实验的时候对同一属性做dummy以及factorize数字化时,貌似dummy效果会好一点。???

      规范化,把数据压缩到一个范围,具体应用场景,不清楚

      df.aa = scaler.fit_transform(df.aa)

      df.cc =scaler.fit_transform(df.cc)

      ????????aa??????? bb??????? cc??????? dd

      1 -0.447214 -0.447214 -0.959886? 1.731810

      3?1.341641? 1.341641 -0.836030-0.577270

      ?

      当对数据进行离散化时,一个小结就是:

      1. 属性集可以分为2种类型:Quantitative(定量) and Qualitative(定性)。?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 定量是指可以按照某种规则进行排序,一般指数字类,例如年龄、工资等。??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 定性不容易排序,一般指字符串或数字与字符串的组合,如姓名等。
      2. 定量数据转换:scale以及bining
      • scaling:数据缩放,当属性值范围较大时,可以将其按照比例进行缩小,范围可以从0-1,-1-1,具体如何设置范围,不清楚。基于神经网络算法,或者对基于距离的分类或聚类有效。对基于相似度而不是距离的算法,如随机森林,效果不一定好
      • bining:面元组合,产生一个有序的分类值,例如年龄,工资等。调用pandas.qcut(),利用分位数对整个数值范围划分为几个bin,实验过程中,貌似有个最大bin数,9,当配置大于9时即出错。所以应该还是适用于范围并非太大的属性集。分类后产生的bin列,元素为string范围值,可通过哑变量、枚举或factorize进行数值化。

    • 枚举enumerate与因式分解factorize感觉差不多,都是将该列相同元素映射为一个数值。数值范围为连续自然数
    • 哑变量dummy,单独为不同元素生成一列值,用0,1表示,主要用于标称属性或二元属性
    • 当属性值范围较多时,哑变量会占用太大内存。另外使用随机森林生成feature_importance时,哑变量的列向量会分化了该属性的重要性,效果不如factorize好啊。

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读