Допустим, у нас есть следующий фрейм данных. Что в реальном случае представляет собой сравнение столбцов после плавления, вот почему существуют смешанные типы.
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
Но он довольно медленный и не выглядит "как панда" .
Так что мой вопрос - это быстрее? более оптимальное решение?