Перебирать столбцы DataFrame и присваивать значения - PullRequest
0 голосов
/ 04 января 2019

У меня есть DataFrame (данные) с одним столбцом, индексированный по упорядоченным датам, и я хочу создать второй DataFrame с p столбцами и назначить каждому столбцу смещенную версию данных. Я хочу видеть в первом столбце data.shift (1), во втором столбце data.shift (2) и т. Д. Моя реализация выглядит следующим образом:

lagged_data = pd.DataFrame(index = data.index, columns=[i+1 for i in range(p)])
for i in range(p):
    lagged_data.iloc[:,i] = data.shift(i+1)

Однако после выполнения обновляется только первый столбец, а все остальные остаются заполненными np.nan. Ниже результат (с p = 3):

print(lagged_data.head())

           1   2    3
Date                 
gen-75   NaN NaN  NaN
feb-75  0.03 NaN  NaN
mar-75  0.04 NaN  NaN
apr-75 -0.04 NaN  NaN
mag-75  0.04 NaN  NaN

Как ни странно, повторяя один и тот же цикл, все столбцы заполняются правильно. Я действительно не вижу причины такого поведения, я также пытался создать копию, выполнив

 lagged_data.iloc[:,i] = data.shift(i+1).copy()

но это дает тот же результат, что и раньше

1 Ответ

0 голосов
/ 08 января 2019

Назначить серию серии

Вы присваиваете кадр данных серии. Хотя это дает результат, вы не должны ожидать, что это сработает. Вместо этого назначьте серию серии и используйте pd.Series.shift:

data = pd.DataFrame({'A': [1, 2, 3, 4, 5]})

lagged_data = pd.DataFrame(index=data.index, columns=[i+1 for i in range(3)])
for i in range(3):
    lagged_data.iloc[:,i] = data.iloc[:, 0].shift(i + 1)

print(lagged_data)

#      1    2    3
# 0  NaN  NaN  NaN
# 1  1.0  NaN  NaN
# 2  2.0  1.0  NaN
# 3  3.0  2.0  1.0
# 4  4.0  3.0  2.0

Обратите внимание: data - это объект pd.DataFrame, а data.iloc[:, 0] - это pd.Series объект.

pd.concat с пониманием списка

В этом случае вместо этого вы можете использовать pd.concat со списком, указав аргумент keys и axis=1:

res = pd.concat([data.iloc[:, 0].shift(i+1) for i in range(3)],
                keys=list(range(1, 4)), axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...