说明
在做数据分析或者机器学习工作时,很多情况会涉及对csv格式的处理分析。pandas作为数据科学的常用工具包,对于csv格式数据的处理已经相当成熟。从对过去几个项目中的处理过的csv格式数据总结来看,发现有两个普遍而关键的处理用法:
- 关注读取csv获得的dataframe中,各列的数据类型;
- 如何快速对某个或者某个列进行数据变换。
变量数据类型
当我们用pandas读取csv表格后,会获取到一个dataframe,首先需要检查dataframe所有列的数据类型,如下图所示:
可以看到,最后两列数据类型为object
。一旦出现这种情况,一定要将这些列准换为指定的数据类型。否则这些列的数据不能正常被读取到,会出现以下情况:
上图中,处理逻辑是获取目标变量列中指定元素的索引,当目标变量列数据类型为object时,由于ll
为列表class_range
中的元素,其为数值或者字符类型,判断两者相等有两层含义,一是数据类型相同,二是数值相等。然而两者数据类型不同,造成即使该列存在等于指定数值的元素,最后返回的索引仍为空。
因此,需要对各列进行数据类型转换,如下图所示:
只有完成了数据类型的转换,才能保证后续能够对获取到的dataframe进行正常处理。
更改某个或者某些变量的值
在dataframe处理过程中,经常需要对某个或者某些变量的数值进行同时处理,如下面两种情况:
- 对某些列同时进行数据类型转换,如下图所示:
采用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
关键字自定义函数,使得全部输入同时应用该函数进行处理。