Python 数据科学指南1.21 队列进行预处理

数据预处理:

1.采用字符串的形式获取所有的数据,在后续的场景在执行需要的数据格式转换;

2.在数据源阶段就完成转换工作。

示例代码一:

from io import StringIO
import numpy as np

in_data = StringIO("30kg,inr2000,31.11,56.33,1\n52kg,inr8000.35,12,16.7,2")
data = np.genfromtxt(in_data,delimiter=",")
print (data)

代码输出:

[[  nan   nan 31.11 56.33  1.  ]

 [  nan   nan 12.   16.7   2.  ]]

可以看得,最开始的两列并没有被读取。

进行数据预处理,改进示例代码一:

from io import StringIO
import numpy as np

in_data = StringIO("30kg,inr2000,31.11,56.33,1\n52kg,inr8000.35,12,16.7,2")
print ("第一次输出-------------------无预处理")
print (np.genfromtxt(in_data,delimiter=","))
#1.使用lambda函数定义两个数据预处理函数
#第一个函数,将列1中的字符串kg从右面清除
#第二个函数将列2中的字符串inr从左面清除
strip_func_1 = lambda x:float(x.rstrip("kg".encode())) #rstrip()函数里面的str需要使用encode编码,否则会报错a bytes-like object is required, not 'str'
strip_func_2 = lambda x:float(x.lstrip("inr".encode()))

#2.创建一个函数的字典
#字典的键就是被函数应用的列名,值就是函数。这个字典被作为参数converters传递给genfromtxt。
convert_funcs = {0:strip_func_1 , 1:strip_func_2}

#3.将这个函数的字典传递给genformtxt
#warnning:注释掉下面对in_data的第二次定义,这里会报错 IndexError: list index out of range。测试发现in_data现在为空了。
#原因猜测是StringIO读取一次之后,缓存为空,输入流被关闭了?????欢迎留言讨论!
in_data = StringIO("30kg,inr2000,31.11,56.33,1\n52kg,inr8000.35,12,16.7,2")
data = np.genfromtxt(in_data,delimiter=",",converters=convert_funcs)
print ("第二次输出-------------------数据格式处理")
print (data)



#4.使用lambda函数来处理输入中丢失的记录
#注意\n换行符后面没有逗号!逗号是分隔列的,换行符是分隔行的。
in_data = StringIO("10,20,30\n56,,90\n33,46,89")
#lambda采用-999来代替缺失值。
mss_func = lambda x:float(x.strip() or -999)
#converters参数值是一个字典,键值是应用函数的列,列的index从0开始,字典的值是所应用的函数。
data = np.genfromtxt(in_data,delimiter=",",converters={1:mss_func})
print ("第三次输出-------------------处理缺失值")
print (data)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值