通常,我希望将一个函数映射到包含空的列,而我发现我自己不得不编写一些关于空值的逻辑检查。例如:
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这种事我总觉得有点笨重。是否有更好的方法将函数应用于列的非空行?
发布于 2015-05-11 03:29:55
使用isnull或非零方法筛选出列的非空元素。
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为null (np.nan)
fruits first_fruit
0 Apple Pear Apple
1 NaN NaN
2 Orange Banana Orange在这种情况下,我不认为type(x) != float是一个很好的成语(因为python是动态类型的,您不应该需要验证函数的输入类型),它实际上也不适用于熊猫数据框架中的浮动列。
例如:
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发布于 2015-05-11 11:53:20
使用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 Orangehttps://stackoverflow.com/questions/30159133
复制相似问题