众所周知,Pytnon非常擅长处理数据,尤其是后期数据的清洗。今天佩森酱就给大家介绍数据处理神器Pipe。什么是Pipe简单来说,Pipe是Python的三方库。通过Pipe,我们可以将一个函数的处理结果传递给另一个函数,这意味着你的代码会非常简洁。使用Pipe需要提前安装,直接使用pip安装即可。pipinstallpipefilterelement类似于filter,在pipe中操作可以过滤可迭代对象中的元素。In[5]:numbers=[0,1,2,3,4,5]In[6]:list(numbers|where(lambdax:x%2==0))Out[6]:[0,2,4]action元素类似于map,select操作可以将函数应用到可迭代对象中的每一个元素上。在下面的示例中,我们将列表中的元素加倍。In[8]:list(numbers|select(lambdax:x*2))Out[8]:[0,2,4,6,8,10]当然也可以多个操作组合在一起玩。下面的例子是选择列表中的偶数,将其扩大2倍。不同于filter和map,pipe可以连接多个操作,就像一个水管套管,所以我觉得pipe这个名字也很接地气。在[10]:list(numbers...:|where(lambdax:x%2==0)...:|select(lambdax:x*2)...:)...:Out[10]:[0,4,8]连接元素操作嵌套列表是很痛苦的。好消息是pipe提供了一个非常友好的接口,只需要链接起来。In[11]:list([[1,2],[3,4],[5]]|chain)Out[11]:[1,2,3,4,5]In[30]:list((1,2,3)|chain_with([4,5],[6]))Out[30]:[1,2,3,4,5,6]In[31]:list((1,2,3)|chain_with([4,5],[6,[7]]))Out[31]:[1,2,3,4,5,6,[7]]如你所见,仅链您可以拆卸一层。如果要拆解多层嵌套,不要慌张,遍历可以轻松搞定。In[12]:list([[1,2],[[[3],[[4]]],[5]]]|遍历)Out[12]:[1,2,3,4,5]结合select得到字典中的一个字段属性集合。In[32]:fruits=[...:{"name":"apple","price":[2,5]},...:{"name":"orange","price":4},...:{"name":"grape","price":5},...:]In[33]:list(fruits...:|select(lambdafruit:fruit["price"])...:|traverse)...:Out[33]:[2,5,4,5]分组对列表中的元素进行分组是必不可少的,这可以通过pipe中的groupby来完成。In[26]:list(numbers...:|groupby(lambdax:'Even'ifx%2==0else'Odd')...:|select(lambdax:{x[0]:list(x[1])})...:)...:Out[26]:[{'Even':[0,2,4]},{'Odd':[1,3,5]}]同样,还有可以在select中添加where过滤条件。In[27]:list(numbers...:|groupby(lambdax:'Even'ifx%2==0else'Odd')...:|select(lambdax:{x[0]:list(x[1]|where(lambdax:x>2))})...:)...:Out[27]:[{'Even':[4]},{'Odd':[3,5]}]行列交换数据处理经常会用到行列转换,尤其是使用DataFrame时,使用代码的流水线来进行行列转换。In[24]:[[1,2,3],[4,5,6],[7,8,9]]|transposeOut[24]:[(1,4,7),(2,5,8),(3,6,9)]删除元素对列表进行去重也是常用的操作,在管道中使用dedup对列表进行去重。In[28]:list([1,1,2,2,3,3,1,2,3]|dedup)Out[28]:[1,2,3]与dedup不同,uniq只会保留一个对于连续重复的元素,不连续的重复元素不过滤。In[29]:list([1,1,2,2,3,3,1,2,3]|uniq)Out[29]:[1,2,3,1,2,3]总结一下今天的派森江给大家介绍一款数据处理的神器。使用管道可以将繁琐的操作压缩成几行甚至一行代码,提高了代码的可读性和整洁度。我好开心~
