Я пытаюсь создать своего рода «функциональный выбор», который дает пользователям гибкость в создании конфигурации для выбора данных в pandas фреймах данных. Однако я столкнулся с некоторыми проблемами, которые озадачивают меня.
Ниже приведен упрощенный пример:
>>> import pandas as pd
>>> df = pd.DataFrame({'date': pd.date_range(start='2020-01-01', periods=4), 'val': [1, 2, 3, 4]})
>>> df
date val
0 2020-01-01 1
1 2020-01-02 2
2 2020-01-03 3
3 2020-01-04 4
Вопрос 1. Почему я получаю другой результат, когда я по-разному применяю функцию к столбцу?
>>> import datetime
>>> bydatetime = lambda x : x == datetime.date(2020, 1, 1)
>>> bydatetime(df['date'])
0 False
1 False
2 False
3 False
Name: date, dtype: bool
>>> df['date'].apply(bydatetime) # why does this one work?
0 True
1 False
2 False
3 False
Name: date, dtype: bool
Однако, если я использую типы numpy 'datetime64
или pandas' Timestamp
для создания лямбда-функции, это будет работать.
>>> import numpy as np
>>> bynpdatetime = lambda x : x == np.datetime64('2020-01-01')
>>> bynpdatetime(df['date'])
0 True
1 False
2 False
3 False
Name: date, dtype: bool
>>> df['date'].apply(bynpdatetime)
0 True
1 False
2 False
3 False
Name: date, dtype: bool
>>> bypdtimestamp = lambda x : x == pd.Timestamp('2020-01-01')
>>> bypdtimestamp(df['date'])
0 True
1 False
2 False
3 False
Name: date, dtype: bool
>>> df['date'].apply(bypdtimestamp)
0 True
1 False
2 False
3 False
Name: date, dtype: bool
Поэтому я вернулся к использованию следующего простого выбора, и использование datetime.date
не сработало. Если datetime.date
просто не будет работать, почему df['date'].apply(bydatetime)
будет работать?
>>> df[df['date'] == datetime.date(2020, 1, 1)]
Empty DataFrame
Columns: [date, val]
Index: []
>>> df[df['date'] == np.datetime64('2020-01-01')]
date val
0 2020-01-01 1
>>> df[df['date'] == pd.Timestamp('2020-01-01')]
date val
0 2020-01-01 1
И последнее, но не менее важное: почему тип столбца date
datetime64
в DataFrame, но * 1022? * когда выбрана одна клетка? В чем разница между ними?
>>> df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 4 non-null datetime64[ns]
1 val 4 non-null int64
dtypes: datetime64[ns](1), int64(1)
memory usage: 192.0 bytes
>>>
>>> df['date'][0]
Timestamp('2020-01-01 00:00:00')
Я уверен, что есть нечто фундаментальное, чего я здесь не понимаю. Большое спасибо за что-то конструктивное.