#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