Замените некоторые значения во фрейме данных на NaN, если индекс строки не существует в объекте с несколькими индексами

#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