Подтвердить что ты не робот

Скопируйте все значения в столбце в новый столбец в фрейме данных pandas

Это очень простой вопрос, я просто не могу найти ответ.

У меня есть подобный dataframe, называемый df:

  A     B     C
 a.1   b.1   c.1
 a.2   b.2   c.2
 a.3   b.3   c.3

Затем я извлекаю все строки из df, где столбец "B" имеет значение "b.2". Я присваиваю эти результаты df_2.

df_2 = df[df['B'] == 'b.2']

df_2 становится:

  A     B     C
 a.2   b.2   c.2

Затем я копирую все значения в столбце "B" в новый столбец с именем "D". Вызов df_2:

  A     B     C     D
 a.2   b.2   c.2   b.2

Когда я выполняю задание следующим образом:

df_2['D'] = df_2['B']

Я получаю следующее предупреждение:

Значение пытается установить на копии среза из DataFrame. Пытаться используя .loc [row_indexer, col_indexer] = значение вместо

См. оговорки в документации: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy


Я также пытался использовать .loc при создании df_2 следующим образом:

df_2 = df.loc[df['B'] == 'b.2']

Однако я все еще получаю предупреждение.

Любая помощь очень ценится.

4b9b3361

Ответ 1

Вы можете просто назначить B новому столбцу, Like -

df['D'] = df['B']

Пример/Демо -

In [1]: import pandas as pd

In [2]: df = pd.DataFrame([['a.1','b.1','c.1'],['a.2','b.2','c.2'],['a.3','b.3','c.3']],columns=['A','B','C'])

In [3]: df
Out[3]:
     A    B    C
0  a.1  b.1  c.1
1  a.2  b.2  c.2
2  a.3  b.3  c.3

In [4]: df['D'] = df['B']                  #<---What you want.

In [5]: df
Out[5]:
     A    B    C    D
0  a.1  b.1  c.1  b.1
1  a.2  b.2  c.2  b.2
2  a.3  b.3  c.3  b.3

In [6]: df.loc[0,'D'] = 'd.1'

In [7]: df
Out[7]:
     A    B    C    D
0  a.1  b.1  c.1  d.1
1  a.2  b.2  c.2  b.2
2  a.3  b.3  c.3  b.3

Ответ 2

Проблема находится в строке перед тем, который выдает предупреждение. Когда вы создаете df_2, где вы создаете копию среза фрейма данных. Вместо этого, когда вы создаете df_2, используйте .copy(), и вы не получите этого предупреждения позже.

df_2 = df[df['B'] == 'b.2'].copy()

Ответ 3

Я думаю, что правильный метод доступа использует индекс:

df_2.loc[:,'D'] = df_2['B']