почему операция pandas df.loc [:, ['a', 'b'] = df.loc [:, ['c', 'd'] не изменяет значения в df.loc [: , ['a', 'b']? - PullRequest
1 голос
/ 16 апреля 2020

Я должен использовать df.loc[:, ['a', 'b'] = df.loc[:, ['c', 'd'].values, чтобы успешно изменить значения в df.loc[:, ['a', 'b'], почему?

В отличие от этого, df.loc[:, ['a'] = df['c'] работает! почему?

df это pandas.DataFrame.

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Ответ для старых версий pandas, в последней версии pandas все работает хорошо, это означает, что нет необходимости преобразовывать в numpy массивы или переименовывать столбцы.

Причина называется выравниванием индекса, здесь назначены разные имена столбцов c,d до a,b столбцов, поэтому не удалось. Для предотвращения этого используется преобразование выбранного DataFrame в массив numpy, потому что массив не имеет столбцов, поэтому работает хорошо.

Или вы можете использовать rename для одинаковых имен столбцов в обоих DataFrames:

df = pd.DataFrame({
        'a':list('abcdef'),
         'b':[4,5,4,5,5,4],
         'c':[7,8,9,4,2,3],
         'd':[1,3,5,7,1,0],
})

df.loc[:, ['a', 'b']] = df.loc[:, ['c', 'd']].rename(columns={'c':'a', 'd':'b'})
print (df)
   a  b  c  d
0  7  1  7  1
1  8  3  8  3
2  9  5  9  5
3  4  7  4  7
4  2  1  2  1
5  3  0  3  0

В Серии нет колонок, поэтому работаю хорошо.

0 голосов
/ 16 апреля 2020

Следуя ответу @jezrael, вы можете переназначить столбец, используя тот же синтаксис для определения нового столбца, что я имею в виду:

import pandas as pd

df = pd.DataFrame({
         'a':list('abcdef'),
         'b':[4,5,4,5,5,4],
         'c':[7,8,9,4,2,3],
         'd':[1,3,5,7,1,0]})

df[['a', 'b']] = df.loc[:, ['c', 'd']]
df[['a', 'b']] = df[['c', 'd']]

Обе строки дадут ожидаемый результат. С другой стороны, чтобы использовать lo c в левой части, вы можете преобразовать правую часть в массив numpy или переименовать столбец, как в ответе jezrael:

df.loc[:, ['a', 'b']] = df.loc[:, ['c', 'd']].to_numpy()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...