Заменить уникальные значения новыми значениями в dataframe, pandas?

#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