Задайте значение для всего столбца фрейма pandas

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

In  [1]: df
Out [1]: 
     issueid   industry
0        001        xxx
1        002        xxx
2        003        xxx
3        004        xxx
4        005        xxx

Из того, что я видел, loc является лучшей практикой при замене значений в фрейме данных (или не так ли?):

In  [2]: df.loc[:,'industry'] = 'yyy'

Тем не менее, я до сих пор получил это много разговоров о предупреждении:

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead

Если я сделаю

In  [3]: df['industry'] = 'yyy'

Я получил то же предупреждение.

Есть идеи? Работа с Python 3.5.2 и pandas 0.18.1.

Ответ 1

Python может делать неожиданные вещи, когда новые объекты определяются из существующих. Вы указали в комментарии выше, что ваш фрейм данных определен в соответствии с df = df_all.loc[df_all['issueid']==specific_id,:]. В этом случае df на самом деле просто df_all строки, хранящиеся в объекте df_all: новый объект НЕ создается в памяти.

Чтобы вообще избежать этих проблем, мне часто приходится напоминать себе об использовании модуля copy, который явно заставляет объекты копироваться в память, чтобы методы, вызываемые для новых объектов, не применялись к исходному объекту. У меня была та же проблема, что и у вас, и я избежал ее с deepcopy функции deepcopy.

В вашем случае это должно избавить от предупреждающего сообщения:

from copy import deepcopy
df = deepcopy(df_all.loc[df_all['issueid']==specific_id,:])
df['industry'] = 'yyy'

РЕДАКТИРОВАТЬ: Также см. Дэвид М. отличный комментарий ниже!

df = df_all.loc[df_all['issueid']==specific_id,:].copy()
df['industry'] = 'yyy'

Ответ 2

Вы можете сделать:

df['industry'] = 'yyy'

Ответ 3

Вы можете использовать функцию assign:

df = df.assign(industry='yyy')

Ответ 4

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

import pandas as pd

data = [('001','xxx'), ('002','xxx'), ('003','xxx'), ('004','xxx'), ('005','xxx')]

df = pd.DataFrame(data,columns=['issueid', 'industry'])

print("Old DataFrame")
print(df)

df.loc[:,'industry'] = str('yyy')

print("New DataFrame")
print(df)

Теперь, если вы хотите поместить числа вместо букв, вы должны создать и массив

list_of_ones = [1,1,1,1,1]
df.loc[:,'industry'] = list_of_ones
print(df)

Или, если вы используете Numpy

import numpy as np
n = len(df)
df.loc[:,'industry'] = np.ones(n)
print(df)

Ответ 5

df.loc[:,'industry'] = 'yyy'

Это делает волшебство. Вы должны добавить '.loc' с ':' для всех строк. Надеюсь, поможет

Ответ 6

df.loc[:,'industry'] = 'yyy' меня была похожая проблема даже с таким подходом df.loc[:,'industry'] = 'yyy', но как только я обновил ноутбук, он заработал хорошо.

Вы можете попробовать обновить ячейки после того, как у вас есть df.loc[:,'industry'] = 'yyy'.

Ответ 7

Мне кажется, что:

df1 = df [df ['col1'] == some_value] НЕ будет создавать новый DataFrame, в основном изменения в df1 будут отражены в родительском df. Это приводит к предупреждению. Принимая во внимание, df1 = ДФ [ДФ [ 'col1]] == some_value].copy() будет создан новый DataFrame, а также изменения в df1 не будут отражены в ФР. метод copy() рекомендуется, если вы не хотите вносить изменения в ваш оригинальный df.

Ответ 8

Это дает вам возможность добавлять условия в строки и затем изменять все ячейки определенного столбца, соответствующего этим строкам:

df.loc[(df['issueid'] == '001'), 'industry'] = str('yyy')

Ответ 9

Измените строку .loc на:

df['industry'] = 'yyy'

Пример вывода

>>> df
   issueid industry
0        1      xxx
1        2      xxx
2        3      xxx
3        4      xxx
4        5      xxx
>>> df['industry'] = 'yyy'
>>> df
   issueid industry
0        1      yyy
1        2      yyy
2        3      yyy
3        4      yyy
4        5      yyy