DataFrame MultiIndex, почему нарезка на df.loc [:, (All, [x, y])] просто возвращает результат, но не дает новые столбцы - PullRequest
0 голосов
/ 25 апреля 2020

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

cols = pd.MultiIndex.from_tuples([(x, y) for x in ['A', 'B'] for y in ['x', 'y']])
data = np.matrix([[1, 2, 3, 4], [11, 22, 33, 44]])

df = pd.DataFrame(data, columns=cols)
df

Out[]:
    A       B
     x   y   x   y
---+---+---+---+---
0    1   2   3   4
1   11  22  33  44

Я пытаюсь сделать что-то подобное (случай 1 - работает как положено):

df.loc[:, ('A', 'x_delta')] = df.loc[:, ('A', 'x')].shift(periods=1)
df.loc[:, ('A', 'y_delta')] = df.loc[:, ('A', 'y')].shift(periods=1)
df.loc[:, ('B', 'x_delta')] = df.loc[:, ('B', 'x')].shift(periods=1)
df.loc[:, ('B', 'y_delta')] = df.loc[:, ('B', 'y')].shift(periods=1)
df = df.sort_index(axis=1)
df

Out[]:
     A                            B
     x  x_delta   y   y_delta    x  x_delta   y  y_delta
---+--+--------+----+--------+----+--------+---+--------
0    1      NaN    2      NaN    3      NaN   4      NaN
1   11      1.0   22      2.0   33      3.0  44      4.0

, но с loc & slice на уровне = 0 и в одной строке (случай 2 - это не работает ):

df.loc[:, (slice(None), ['x_delta', 'y_delta'])] = df.loc[:, (slice(None), ['x', 'y'])].shift(periods=1)
df

Out[]:
    A       B
     x   y   x   y
---+---+---+---+---
0    1   2   3   4
1   11  22  33  44

Мой вопрос: почему во втором случае df.loc[:, (slice(None), ['x_delta', 'y_delta'])] = ... ничего не делать (без ошибок, без столбцов x_delta и y_delta в df), но когда я не делаю нарезки, это прекрасно работает для одного столбца (случай 1)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...