pandas сдвиг не работает для подмножества столбцов и строк - PullRequest
2 голосов
/ 03 апреля 2020

У меня есть следующий фрейм данных:

df = pd.DataFrame({"a":[1,2,3,4,5], "b":[3,2,1,2,2], "c": [2,1,0,2,1]})

    a   b   c
0   1   3   2
1   2   2   1
2   3   1   0
3   4   2   2
4   5   2   1

и я хочу сместить столбцы a и b с индексами от 0 до 2. Т.е. мой желаемый результат -

    a   b   c
0  NaN NaN  2
1   1   3   1
2   2   2   0
3   4   1   2
4   5   2   1

Если я сделаю

df[["a", "b"]][0:3] = df[["a", "b"]][0:3].shift(1)

и посмотрю на df, похоже, он не изменился.

Однако, если выбрать только строки или столбцы, это работает:

Один столбец, выберите подмножество строк:

df["a"][0:3] = df["a"][0:3].shift(1)

Вывод:


     a  b   c
0   NaN 3   2
1   1.0 2   1
2   2.0 1   0
3   4.0 2   2
4   5.0 2   1

Аналогично, если я выберу список столбцов, но все строки , он тоже будет работать, как и ожидалось:

df[["a", "b"]] = df[["a", "b"]].shift(1)

output:

    a   b   c
0   NaN NaN 2
1   1.0 3.0 1
2   2.0 2.0 0
3   3.0 1.0 2
4   4.0 2.0 1

Почему df[["a", "b"]][0:3] = df[["a", "b"]][0:3].shift(1) не работает должным образом? я что-то упустил?

1 Ответ

2 голосов
/ 03 апреля 2020

Проблема заключается в двойном выборе - сначала столбцы, а затем строки, поэтому обновите копию. Проверьте также порядок оценки имеет значение .

Возможное решение с одним выбором DataFrame.loc для меток индекса и имен столбцов:

df.loc[0:2, ["a", "b"]] = df.loc[0:2, ["a", "b"]].shift(1)
print (df)
     a    b  c
0  NaN  NaN  2
1  1.0  3.0  1
2  2.0  2.0  0
3  4.0  2.0  2
4  5.0  2.0  1

Если нет индекс по умолчанию и необходимо выбрать первые 2 строки:

df = pd.DataFrame({"a":[1,2,3,4,5], "b":[3,2,1,2,2], "c": [2,1,0,2,1]},
                   index=list('abcde'))

df.loc[df.index[0:2], ["a", "b"]] = df.loc[df.index[0:2], ["a", "b"]].shift(1)
print (df)
     a    b  c
a  NaN  NaN  2
b  1.0  3.0  1
c  3.0  1.0  0
d  4.0  2.0  2
e  5.0  2.0  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...