Панды: доступ к атрибутам меток времени после переиндексации - PullRequest
0 голосов
/ 09 июля 2019

У меня проблемы с пониманием того, что происходит с меткой времени после переиндексации фрейма данных с использованием pd.date_range. Если у меня есть следующий пример, где я использую pd.DataFrame.reindex для создания более длинных временных рядов:

import pandas as pd
import numpy as np

idx_inital = pd.date_range('2004-03-01','2004-05-05')

df = pd.DataFrame(index = idx_inital, data={'data': np.random.randint(0,100,idx_inital.size)})

idx_new = pd.date_range('2004-01-01','2004-05-05')

df= df.reindex(idx_new, fill_value = 0)

, который возвращает ожидаемый результат, когда все данные назначены 0:

            data
2004-01-01     0
2004-01-02     0
2004-01-03     0
2004-01-04     0
2004-01-05     0

Теперь, если я хочу использовать применить, чтобы назначить новый столбец, используя:

def year_attrib(row):
    if row.index.month >2:
        result = row.index.year + 11
    else:
        result = row.index.year + 15
    return result

df['year_attrib'] = df.apply(lambda x: year_attrib(x), axis=1)

Я получаю сообщение об ошибке:

AttributeError: ("'Index' object has no attribute 'month'", 'occurred at index 2004-01-01 00:00:00')

Если я проверю, что каждая строка передается в year_attrib с помощью:

row = df.iloc[0]
row
Out[32]: 
data    0
Name: 2004-01-01 00:00:00, dtype: int32

Похоже, метка времени передается в Name, и я не знаю, как получить к ней доступ. Когда я смотрю на row.index, я получаю:

row.index
Out[34]: Index(['data'], dtype='object')

В чем причина такого поведения?

1 Ответ

1 голос
/ 09 июля 2019

Проблема в том, что при использовании функции apply для DataFrame с параметром axis=1 каждая строка кадра данных передается в функцию как Series.См. документ панд .

Итак, что на самом деле произошло в функции year_attrib, row.index вернет индекс row, то есть columnкадра данных.

In [5]: df.columns
Out[5]: Index(['data'], dtype='object')

, таким образом, AttributeError будет повышен при использовании row.index.month.

, если вы действительно хотите использовать эту функцию, чтобы получить то, что вы хотите, используйте row.name.monthвместо этого.

, однако все еще предлагается использовать способ vectorized, например:

In [10]: df.loc[df.index.month>2, 'year_attrib'] = df[df.index.month>2].index.year + 11

In [11]: df.loc[df.index.month<=2, 'year_attrib'] = df[df.index.month>2].index.year + 15

In [12]: df
Out[12]:
            data  year_attrib
2004-03-01    93         2015
2004-03-02    48         2015
2004-03-03    88         2015
2004-03-04    44         2015
2004-03-05    11         2015
2004-03-06     4         2015
2004-03-07    70         2015
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...