使用pandas时保留None值

时间:2015-11-02 18:50:04

标签: python pandas

我有一个数据框,需要添加一列c3。列中的每个条目都取决于另外两列c1c2中同一行的条目。 c3最初是通过将功能映射到c1c2中的条目对来创建的。我正在尝试通过使用c3来加速apply的创建,因为有很多数据。这就是我现在所拥有的:

frame['c3'] = frame.apply(lambda x: my_func(x[c1], x[c2],
                          extra_arg1, extra_arg2), axis=1). 

但是,当我执行此操作时,'c3'变为float64,而我需要它为object类型,以保留None值,以便进一步处理数据帧(而不是将它们转换为NaN,这就是给定代码行所发生的情况,因为函数生成的其他值的类型为int)。我知道可以使用astype更改列的类型,但在已创建的列上使用它不起作用 - NaN值仍为NaN值。有没有办法告诉apply我想要保留None值?我是否需要在lambda表达式中或my_func内执行一些特殊操作?

2 个答案:

答案 0 :(得分:1)

Pandas(至少在18.0版本中)有一个

  

convert_dtype:boolean,默认为True

     

尝试找到更好的dtype   元素函数结果。如果为False,则保留为dtype = object

a=pd.Series(['1','2','3',None])
a.apply(lambda x: int(x) if x is not None else None,convert_dtype=False)

Out[101]: 

0       1
1       2
2       3
3    None
dtype: object

地图功能没有类似的功能

答案 1 :(得分:0)

您的应用功能很奇怪,因为您没有使用x,而是在每一行中提取数据帧的两个完整列。

我建议你使用NaN并在之后将它们转换为None:

frame['c3'] = frame.apply(lambda row: my_func(row[c1], row[c2],
                      extra_arg1, extra_arg2), axis=1)

frame['c3'] = frame['c3'].where((pd.notnull(frame['c3'])), None)