假设我们有以下数据框。实际上,这是熔融后色谱柱的比较,这就是混合类型的原因。
df = pd.DataFrame({'value':[0.0, 0.0, pd.Timedelta(hours=1), pd.Timedelta(0)]})
value
0 0
1 0
2 0 days 01:00:00
3 0 days 00:00:00
我想做的是检查这是否等于
0
并基于此创建条件列。因此,首先我们需要一个布尔值来标记哪些行为0。
简单地使用
eq
或==
,将无法工作:df['value'].eq(0)
0 True
1 True
2 False
3 False
Name: value, dtype: bool
这是因为我们可能具有
Timedelta
类型,所以我认为可以将timedelta转换为秒。所以我检查了:df['value'].apply(type) == pd._libs.tslibs.timedeltas.Timedelta
0 False
1 False
2 True
3 True
Name: value, dtype: bool
哪个有效。
然后使用,这没有用:
np.where(df['value'].apply(type) == pd._libs.tslibs.timedeltas.Timedelta,
df['value'].total_seconds(),
df['value'])
'Series' object has no attribute 'total_seconds'
最后,这可行。
df['value'].apply(lambda x: x.total_seconds() if type(x) == pd._libs.tslibs.timedeltas.Timedelta else x).eq(0)
0 True
1 True
2 False
3 True
Name: value, dtype: bool
但是它很慢,看起来不像“熊猫”。
所以我的问题是,这是否有更快,更优化的解决方案?
最佳答案
我将把int
升级到timedelta
pd.to_timedelta(df.value).dt.total_seconds()==0
Out[232]:
0 True
1 True
2 False
3 True
Name: value, dtype: bool
关于python - 检查混合类型列的值是否等于0(带有timedelta和float),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58189397/