关于用pandas处理csv文件数据的一些事


说明

在做数据分析或者机器学习工作时,很多情况会涉及对csv格式的处理分析。pandas作为数据科学的常用工具包,对于csv格式数据的处理已经相当成熟。从对过去几个项目中的处理过的csv格式数据总结来看,发现有两个普遍而关键的处理用法:

  • 关注读取csv获得的dataframe中,各列的数据类型;
  • 如何快速对某个或者某个列进行数据变换。

变量数据类型

当我们用pandas读取csv表格后,会获取到一个dataframe,首先需要检查dataframe所有列的数据类型,如下图所示:
image
可以看到,最后两列数据类型为object。一旦出现这种情况,一定要将这些列准换为指定的数据类型。否则这些列的数据不能正常被读取到,会出现以下情况:
image
上图中,处理逻辑是获取目标变量列中指定元素的索引,当目标变量列数据类型为object时,由于ll为列表class_range中的元素,其为数值或者字符类型,判断两者相等有两层含义,一是数据类型相同,二是数值相等。然而两者数据类型不同,造成即使该列存在等于指定数值的元素,最后返回的索引仍为空。

因此,需要对各列进行数据类型转换,如下图所示:
image
image

只有完成了数据类型的转换,才能保证后续能够对获取到的dataframe进行正常处理。

更改某个或者某些变量的值

在dataframe处理过程中,经常需要对某个或者某些变量的数值进行同时处理,如下面两种情况:

  • 对某些列同时进行数据类型转换,如下图所示:
    image
    采用apply()函数实现。
  • 对某一列的数值同时进行变换,如下所示:
    df["col1"] = df["col1"].map(lambda x : str(ll)+'_'+str(x))
    这里采用map()函数实现,原因是针对单个column,map比apply更快。(解释来自stackoverflow

lambda用法

注意上面通过lambda关键字的用法,与MATLAB用法一致,用于定义匿名函数,同时应用于全部的输入。比如简单的函数:

df["col"] = df["col"].map(lambda x : str(x))

这里是将列名为“col”的全部数值转换为string类型。也可以定义复杂的匿名函数,比如:

def sel_encode(code, x):
    pref = str(code)
    if len(str(code)) == 1:
        pref = '0'+str(code)
    tail = str(x)
    if len(str(x)) == 1:
        tail = '0'+str(x)
    return pref+'_'+tail

df["col"] = df["col"].map(lambda x: sel_encode(2, x)) 

这里,定义了一个更加复杂的匿名函数,列名为“col”的全部数值应用该函数进行变换。

小结

本文主要是从两方面说明:

  • 针对通过pandas读取到的csv数据,首先需要确认各列的数据类型;
  • 可以采用apply()或者map()函数,快速实现对dataframe中某一列或者某些列的数据变换;
  • 通过lambda关键字自定义函数,使得全部输入同时应用该函数进行处理。

文章作者: 安立广
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 安立广 !
  目录