Проверьте, равно ли значение 0 для столбца смешанного типа (с timedelta и float) - PullRequest
1 голос
/ 01 октября 2019

Допустим, у нас есть следующий фрейм данных. Что в реальном случае представляет собой сравнение столбцов после плавления, вот почему существуют смешанные типы.

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

Но он довольно медленный и не выглядит "как панда" .

Так что мой вопрос - это быстрее? более оптимальное решение?

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Я «обновлю» 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
1 голос
/ 01 октября 2019

Вы можете использовать:

df.eq(pd.Timedelta(0))|df.eq(0)



  value
0   True
1   True
2  False
3   True
...