pandas的series的map函数,series数据如何按图索骥?
发布于 作者:苏南大叔 来源:程序如此灵动~pandas
是跨语言的科学计算类的库,在python
和R
中都存在。那么,在苏南大叔的后续文章中,对于介绍pandas
的函数的文章,都不会特别强调python
,但是很有可能会使用python
做范例语言。本文,讲述的是series
的map
函数,这个函数究竟是如何使用的呢?
大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码的故事,欢迎关注。本文将要描述pandas
里面的特殊数据结构series
的map()
功能。这是个非常特殊的函数,功能居然很分裂。(苏南大叔表示挺意外的)。测试环境:win10
,python@3.6.8
,pandas@1.1.5
。
官方说明
这里是pandas
的官方说明链接,大家以这个为准。
下面就结合官方的例子,说说苏南大叔的理解。
姿势一:按图索骥
苏南大叔的理解下,正常情况下,A.map(B)
就是一个按图索骥功能。
传入一个dict
字典对象B
,里面定义了A
中的成员对应于谁,如果A
的成员在B
中没有定义,就返回NaN
。返回新的Series
就是NaN
和对应后的成员组合。范例代码如下:
import pandas as pd
import numpy as np
a = pd.Series(['Java', 'C', 'C++', np.nan])
b = a.map({'Java': 'Core'})
print(b)
输出:
0 Core
1 NaN
2 NaN
3 NaN
dtype: object
特殊情况就是:字典B
也可以定义A
中的NaN
对应于谁。代码如下:
import pandas as pd
import numpy as np
a = pd.Series(['Java', 'C', 'C++', np.nan])
b = a.map({'Java': 'Core', np.nan : "super"})
print(b)
输出:
0 Core
1 NaN
2 NaN
3 super
dtype: object
这个例子中,na_action='ignore'
没有啥用,加上也没有啥反应。
姿势二:简单应用函数
下面的例子中,就是对series
简单应用个转小写字母的功能。
import pandas as pd
import numpy as np
a = pd.Series(['Java', 'C', 'C++', np.nan])
b = a.map(str.lower, na_action='ignore')
print(b)
输出:
0 java
1 c
2 c++
3 NaN
dtype: object
这个例子中,na_action='ignore'
有重要作用,不加的话就会因为NaN
而报错。
TypeError: descriptor 'lower' requires a 'str' object but received a 'float'
姿势三:简单应用自定义函数
下面的例子中,就是对series
简单应用的是个自定义功能。
import pandas as pd
import numpy as np
a = pd.Series(['Java', 'C', 'C++', np.nan])
c=a.map('I like {}'.format)
print(c)
输出:
0 I like Java
1 I like C
2 I like C++
3 I like nan
dtype: object
这里的输出值中的I like nan
显然有问题,需要增加na_action='ignore'
控制输出。
import pandas as pd
import numpy as np
a = pd.Series(['Java', 'C', 'C++', np.nan])
d=a.map('I dont like {}'.format, na_action='ignore')
print(d)
输出值是:
0 I dont like Java
1 I dont like C
2 I dont like C++
3 NaN
dtype: object
姿势四:lambda表达式传参应用
下面的例子中,使用了拉姆达表达式:
import pandas as pd
import numpy as np
a = pd.Series(['Java', 'C', 'C++', np.nan])
d = a.map(lambda x: x.lower())
print(d)
报错:
AttributeError: 'float' object has no attribute 'lower'
需要增加参数na_action='ignore'
控制输出。
import pandas as pd
import numpy as np
a = pd.Series(['Java', 'C', 'C++', np.nan])
d = a.map(lambda x: x.lower(),na_action='ignore')
print(d)
输出:
0 java
1 c
2 c++
3 NaN
dtype: object
课后题
看看下面的这段菜谱配料表的代码输出是啥?
import pandas as pd
from pandas import Series, DataFrame
data = DataFrame({
'food':[
'bacon',
'pulled pork',
'bacon',
'Pastrami',
'corned beef',
'Bacon',
'pastrami',
'honey ham',
'nova lox'
],
'ounces':[4,3,12,6,7.5,8,3,5,6]
})
meat_to_animal = {
'bacon':'pig',
'pulled pork':'pig',
'pastrami':'cow',
'corned beef':'cow',
'honey ham':'pig',
'nova lox':'salmon'
}
data['food2'] = data['food'].map(str.lower)
data['animal2'] = data['food'].map(str.lower).map(meat_to_animal)
data['animal3'] = data['food'].map(lambda x: meat_to_animal[x.lower()],na_action='ignore')
print(data)
结果评论可见,如下所示:
参考文献
- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.map.html
- https://newsn.net/say/python-pandas.html
总结
在苏南大叔看来,这个pandas
里面一切函数及概念,都是很奇怪的。然而,这个pandas
确是在科学计算(机器学习)领域,非常频繁使用的类库。如果您也对这个pandas
也很迷惑的话,这里是苏南大叔的理解:dataframe
就类似excel
里面的一张表,series
就是一张表中的一列。也许会帮助你对pandas
的系列操作进行理解。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。