#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
У меня есть действительно большой фрейм данных, подобный этому:
Customer_Id Day Hour Latitude Longitude
0. a dd hh x1 y1
1. a dd hh' x2 y2
2. a dd hh' x3 y3
3. b dd hh' x4 y4
И тогда у меня есть объект (который я могу преобразовать в фрейм данных, если необходимо) с выборкой в час в день для каждого клиента широты и долготы. Тем не менее, Customer_Id, Day и Hour являются здесь индексами, тогда как раньше их не было. Это выглядит примерно так:
Latitude Longitude
Customer_Id Day Hour
a dd hh x1 y1
dd hh' x3 y3
b dd hh' x4 y4
Ранее у меня было два фрейма данных только с одним индексом каждый (давайте назовем их df1 для первого, который здесь является первым фреймом данных, и df2 для второго, который является фреймом данных с одним индексом, который у меня был вместо второго объекта), поэтому я использовал:
df1['Latitude']= np.where((~df1.index.isin(df2.index)), np.nan, df1['Latitude'])
Ранее этот код работал, но теперь в этом новом сценарии он возвращает эту ошибку:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
Я пытался соответствующим образом изменить код, но это не работает. Может ли кто-нибудь взглянуть на это?
Комментарии:
1. Это предупреждение, а не ошибка: возможно, ваш код все еще выполняет то, что вы намереваетесь. Как именно вы создаете и модифицируете
df1
? Где-то может быть строка, подобнаяdf1 = df1[boolean_mask]
. Добавление.copy()
к такой строке (превращение ее вdf1 = df1[boolean_mask].copy()
) может избежать предупреждения.2. Каков ваш ожидаемый результат с
np.where
, потому что операция, которую вы выполняете сейчас, не имеет смысла. Тем более, что вы сравниваете индекс фрейма данных с агрегированным индексом.
Ответ №1:
Вам нужно сбросить свой индекс с помощью DataFrame.reset_index
:
df1['Latitude']= np.where((~df1.index.isin(df2.reset_index().index)), np.nan, df1['Latitude'])
print(df1)
Customer_Id Day Hour Latitude Longitude
0 a dd hh x1 y1
1 a dd hh' x2 y2
2 a dd hh' x3 y3
3 b dd hh' NaN y4
Что делает reset_index?
Он преобразует индексы обратно в столбцы:
print(df2.reset_index())
Customer_Id Day Hour Latitude Longitude
0 a dd hh x1 y1
1 a dd hh' x3 y3
2 b dd hh' x4 y4