我经常想将一个函数映射到一个包含空值的列,我发现自己必须编写某种逻辑检查空值。例如:
In [656]:
import pandas as pd
import numpy as np
df= pd.DataFrame(['Apple Pear',np.nan,'Orange Banana'], columns = ['fruits'])
df['first_fruit'] = df.fruits.map(lambda x: (type(x) != float and min(x.split())) or np.nan)
df
Out[656]:
fruits first_fruit
0 Apple Pear Apple
1 NaN NaN
2 Orange Banana Banana
这种类型的东西对我来说总是有点笨拙。是否有一种将函数仅应用于列的非空行的首选方法?
答案 0 :(得分:1)
import pandas as pd
import numpy as np
df= pd.DataFrame(['Apple Pear',np.nan,'Orange Banana'], columns = ['fruits'])
df['first_fruit'] = df.fruits[~df.fruits.isnull()].apply(lambda x: x.split()[0])
# or: df['first_fruit'] = df.fruits[df.fruits.notnull()].apply(lambda x: x.split()[0])
这会创建一个新的first_fruit
列,并在其中填充空值(np.nan
)fruits
为空(np.nan
)
fruits first_fruit
0 Apple Pear Apple
1 NaN NaN
2 Orange Banana Orange
我不认为type(x) != float
在这种情况下使用是很好的习惯用法(因为python是动态类型的,你不需要验证函数的输入类型),它也不适用于float pandas数据框中的列。
e.g。
df['prices'] = [1.0, np.nan, 2.0]
df.prices.apply(lambda x: type(x) == float)
打印出来
0 False
1 False
2 False
Name: prices, dtype: bool
如果您必须检查参数类型,请使用isinstance
df.prices.apply(lambda x: isinstance(x, float))
打印出来
0 True
1 True
2 True
Name: prices, dtype: bool
答案 1 :(得分:0)
使用loc
和notnull
将df和矢量化str
方法屏蔽为split
字符串:
In [34]:
df= pd.DataFrame(['Apple Pear',np.nan,'Orange Banana'], columns = ['fruits'])
df['first_fruit'] = df.loc[df['fruits'].notnull(),'fruits'].str.split().str[0]
df
Out[34]:
fruits first_fruit
0 Apple Pear Apple
1 NaN NaN
2 Orange Banana Orange