Периодическая ошибка ключа в Панд

#python #pandas #random

#питон #панды #Случайный

Вопрос:

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

 def nan_fill_random(column_name, nan): for i in range(len(column_name)):  if column_name[i] == nan:  column_name[i] = random.choice(column_name[column_name != nan])  else:  continue  

Я написал функцию, но она периодически выдает KeyError : и значение имеет разные числа, я предполагаю индексы. Кроме того, при перезапуске ячейки она может либо исчезнуть, либо обновиться.

 nan_fill_random(data['education'], 'unknown')  

Вот в чем ошибка

 --------------------------------------------------------------------------- KeyError Traceback (most recent call last) W:ProgramDataAnaconda3libsite-packagespandascoreindexesbase.py in get_loc(self, key, method, tolerance)  3360 try: -gt; 3361 return self._engine.get_loc(casted_key)  3362 except KeyError as err:  W:ProgramDataAnaconda3libsite-packagespandas_libsindex.pyx in pandas._libs.index.IndexEngine.get_loc()  W:ProgramDataAnaconda3libsite-packagespandas_libsindex.pyx in pandas._libs.index.IndexEngine.get_loc()  pandas_libshashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()  pandas_libshashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()  KeyError: 14563  The above exception was the direct cause of the following exception:  KeyError Traceback (most recent call last) ~AppDataLocalTemp/ipykernel_4720/2723938638.py in lt;modulegt; ----gt; 1 nan_fill_random(data['education'], 'unknown')  ~AppDataLocalTemp/ipykernel_4720/1980306790.py in nan_fill_random(column_name, nan)  2 for i in range(len(column_name)):  3 if column_name[i] == nan: ----gt; 4 column_name[i] = random.choice(column_name[column_name != nan])  5 else:  6 continue  W:ProgramDataAnaconda3librandom.py in choice(self, seq)  344 """Choose a random element from a non-empty sequence."""  345 # raises IndexError if seq is empty --gt; 346 return seq[self._randbelow(len(seq))]  347   348 def shuffle(self, x, random=None):  W:ProgramDataAnaconda3libsite-packagespandascoreseries.py in __getitem__(self, key)  940   941 elif key_is_scalar: --gt; 942 return self._get_value(key)  943   944 if is_hashable(key):  W:ProgramDataAnaconda3libsite-packagespandascoreseries.py in _get_value(self, label, takeable)  1049   1050 # Similar to Index.get_value, but we do not fall back to positional -gt; 1051 loc = self.index.get_loc(label)  1052 return self.index._get_values_for_loc(self, loc, label)  1053   W:ProgramDataAnaconda3libsite-packagespandascoreindexesbase.py in get_loc(self, key, method, tolerance)  3361 return self._engine.get_loc(casted_key)  3362 except KeyError as err: -gt; 3363 raise KeyError(key) from err  3364   3365 if is_scalar(key) and isna(key) and not self.hasnans:  KeyError: 14563  

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

1. Скорее всего, проблема кроется в этой части кода random.choice(column_name[column_name != nan])

Ответ №1:

 def nan_fill_random(column_name, nan):    list_values = set(column_name)    try :   list_values.remove(nan)  except :   return(column_name)    column_name = column_name.apply(lambda x: x if x != nan else random.choice(list(list_values)))    return(column_name)  

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

1. Код не проверяет значение Nan и может выбрать и вставить его снова.

2. при этом условии , если x != nan, я проверяю, отличается ли значение от Nan, если это так, то я больше ничего не делаю, я заменяю значение random.choice(list_values)

3. В list_значения остаются nan, и random выбирает их. Я попытался заменить list_values = column_name[column_name != nan] , но код затем выдает ошибку ключа, хотя при отображении этого набора данных в нем нет значений.

4. вам не нужно этого делать , потому что я удаляю nan из list_value с помощью : list_values.remove(nan), поэтому, когда вы случайным образом выбираете значение list_value, nan нет

5. Я понял вас, протестировал код, и по какой-то причине «неизвестные» все еще остаются, хотя их количество уменьшается с каждым запуском ячейки