![](/img/trans.png)
[英]Dealing with None values when using Pandas Groupby and Apply with a Function
[英]Preserve None values when using pandas apply
我有一个需要添加列c3
的数据框。 该列中的每个条目都取决于其他两列c1
和c2
同一行的条目。 c3
最初是通过将函数映射到c1
和c2
成对条目来创建的。 我试图通过使用apply
加快c3
的创建,因为有很多数据。 这是我现在所拥有的:
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
做一些特殊的my_func
吗?
熊猫(至少在18.0版中)具有
convert_dtype:布尔值,默认为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
地图功能没有类似的功能
您的apply函数很奇怪,因为您没有使用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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.