Установите новое значение по атрибуту, используя iloc фрейма данных

#python #pandas #numpy

Вопрос:

Я хочу установить новое значение по атрибуту с помощью iloc фрейма данных, но не удалось. Я не знаю почему, может быть, это устарело..

 # make dataframe which contains vending machine location and demand
df = pd.DataFrame({"latitude":np.random.normal(depot_latitude, 0.007, customer_count), 
                   "longitude":np.random.normal(depot_longitude, 0.007, customer_count), 
                   "demand":np.random.randint(10, 20, customer_count)})

# set the depot as the center and make demand 0 ('0' = depot)
df.iloc[0,0] = depot_latitude
df.iloc[0,0].longitude = depot_longitude
df.iloc[0,0].demand = 0
 

Это приводит к ошибке:

      30 # set the depot as the center and make demand 0 ('0' = depot)
     31 df.iloc[0,0] = depot_latitude
---> 32 df.iloc[0,0].longitude = depot_longitude
     33 df.iloc[0,0].demand = 0
     34 

AttributeError: 'numpy.float64' object has no attribute 'longitude'
 

Комментарии:

1.Первый параметр-это индекс строки, второй — индекс столбца. Я думаю , вы имели в виду: df.iloc[0,1] = depot_longitude , df.iloc[0,2] = 0 или так как индекс по умолчанию с loc df.loc[0, 'latitude'] = depot_latitude и т. Д.

2. Рассмотрите возможность использования iat вместо iloc скаляра (одного элемента).

3. @HenryEcker Я попробовал, но получил это предупреждение: SettingWithCopy Предупреждение: Значение пытается быть установлено для копии фрагмента из фрейма данных См. предостережения в документации: pandas.pydata.org/pandas-docs/stable/user_guide/… self._setitem_with_indexer(индексатор, значение)

Ответ №1:

Вы не должны использовать .iloc для изменения фрейма данных, если вы это сделаете, вы получите предупреждение. Вместо этого вы должны использовать:

 df.loc[0,'latitude'] = depot_latitude
df.loc[0,'longitude'] = depot_longitude
df.loc[0,'demand'] = 0
 

«0» — это индексатор строк,а «долгота» и т. Д.-Индексатор столбцов.

Если по какой-то причине вы хотите использовать числовой индекс столбца, то вы можете сделать что-то вроде:

 df.loc[0,df.columns[0]] = depot_latitude