Задайте значение для всего столбца фрейма 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