#python #pandas #faker
#python #pandas #мошенник
Вопрос:
У меня есть фрейм данных, как показано ниже, я хочу уменьшить его чувствительность, заменив уникальные значения столбца. т. Е. Я хочу заменить столбец last name некоторыми поддельными фамилиями, которые были сгенерированы из библиотеки ‘faker’.
Фрагмент кода выглядит следующим образом.
import pandas as pd
from faker import Faker
fake = Faker()
print(fake.first_name())
print(fake.last_name())
last = ('Meyer', 'Maier', 'Meyer', 'Mayer', 'Meyr', 'Mair')
job = ('data analyst', 'programmer', 'computer scientist',
'data scientist', 'accountant', 'psychiatrist')
language = ('Python', 'Perl', 'Java', 'Java', 'Cobol', 'Brainfuck')
df = pd.DataFrame(list(zip(last, job, language)),
columns =['last', 'job', 'language'],
index=first)
Желаемый результат, который я хочу, — изменить столбец last name на поддельные имена, но, например, Meyer всегда следует заменять теми же поддельными фамилиями.
Комментарии:
1. Получите себе все уникальные имена, создайте словарь с отображением уникального имени -> поддельное имя, pd. сопоставьте это с вашим столбцом
2.
df.loc[df['last'].eq('Meyer'), 'last'] = fake.last_name()
3. Спасибо за комментарий. Но в моем реальном наборе данных у меня много уникальных фамилий, создание dict для всех уникальных фамилий будет невозможно.
4. более 1000.
5. Я думаю, что знаю, как это сделать, я попробую сейчас.
Ответ №1:
Получите все уникальные имена, создайте словарь с отображением уникального имени -> поддельное имя и сопоставьте его с вашим столбцом:
import pandas as pd
first = ('Mike', 'Dorothee', 'Tom', 'Bill', 'Pete', 'Kate')
last = ('Meyer', 'Maier', 'Meyer', 'Mayer', 'Meyr', 'Mair')
job = ('data analyst', 'programmer', 'computer scientist',
'data scientist', 'accountant', 'psychiatrist')
language = ('Python', 'Perl', 'Java', 'Java', 'Cobol', 'Brainfuck')
df = pd.DataFrame(list(zip(last, job, language)),
columns =['last', 'job', 'language'],
index=first)
print(df)
# get all unique names - this can easily hande a couple tenthousand names
all_names = set(df["last"])
# create mapper: you would use fake.last_name() instead of 42 i
# mapper = {k: fake.last_name() for k in all_names }
mapper = {k: 42 i for i, k in enumerate(all_names )}
# apply it
df["last"] = df["last"].map(mapper)
print(df)
Вывод:
# before
last job language
Mike Meyer data analyst Python
Dorothee Maier programmer Perl
Tom Meyer computer scientist Java
Bill Mayer data scientist Java
Pete Meyr accountant Cobol
Kate Mair psychiatrist Brainfuck
# after
last job language
Mike 44 data analyst Python
Dorothee 43 programmer Perl
Tom 44 computer scientist Java
Bill 45 data scientist Java
Pete 46 accountant Cobol
Kate 47 psychiatrist Brainfuck