我有一个数据框,需要添加一列c3
。列中的每个条目都取决于另外两列c1
和c2
中同一行的条目。 c3
最初是通过将功能映射到c1
和c2
中的条目对来创建的。我正在尝试通过使用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
内执行一些特殊操作?
答案 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)