#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. Я понял вас, протестировал код, и по какой-то причине «неизвестные» все еще остаются, хотя их количество уменьшается с каждым запуском ячейки