如何仅使用notnull vaues在pandas dataframe新列中创建新的派生列

时间:2015-05-11 03:14:44

标签: python pandas

我经常想将一个函数映射到一个包含空值的列,我发现自己必须编写某种逻辑检查空值。例如:

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

这种类型的东西对我来说总是有点笨拙。是否有一种将函数仅应用于列的非空行的首选方法?

2 个答案:

答案 0 :(得分:1)

使用isnullnotnull方法过滤掉列的非空元素

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.nanfruits为空(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)

使用locnotnull将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