假设我们有以下数据框。实际上,这是熔融后色谱柱的比较,这就是混合类型的原因。

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/

10-12 21:53