Заменить значения в фрейме данных значениями из другого фрейма данных - Regex - PullRequest
2 голосов
/ 30 мая 2019

У меня есть входные данные, как показано ниже. Здесь «пол» и «этническое происхождение» - это две колонки. Я хотел бы заменить их значения, такие как 1,2,3 и т. Д. Категориальными значениями. Ex - 1 с мужчиной, 2 с женщиной

Файл сопоставления выглядит так, как показано ниже - образец 2 столбца

enter image description here

Входные данные выглядят так, как показано ниже

enter image description here

Я ожидаю, что мой выходной фрейм данных будет выглядеть так

enter image description here

Я попытался сделать это, используя приведенный ниже код. Хотя код работает нормально, я не вижу замены. Не могли бы вы помочь мне с этим?

mapp = pd.read_csv('file2.csv')
data = pd.read_csv('file1.csv')
for col in mapp:
    if col in data.columns:
        print(col)
        s = list(mapp.loc[(mapp[col].str.contains('^\d')==True)].index)
        print("s is",s)
        for i in s:
           print("i is",i)
            try:
               value = mapp[col][i].split('. ')
               print("value 0 is",value[0])
               print("value 1 is",value[1])
               if value[0] in data[col].values:
               data.replace({col:{value[0]:value[1]}})
            except:
                print("column not present")
   else:
       print("No")

Обратите внимание, что я показал только два столбца, но в реальном времени может быть более 600 столбцов. Любой изящный подход / предложения, чтобы сделать это простым, полезен. Поскольку у меня есть два отдельных файла CSV, любые предложения по слиянию / объединению и т. Д. Также будут полезны, но, пожалуйста, обратите внимание, что мой файл сопоставления содержит значения как "1. Мужской", "2. Женский". поэтому я использовал регулярное выражение

Также обратите внимание, что некоторые другие значения столбцов также могут иметь значения сопоставления, начинающиеся с 1. Например: 1. Одинокий, 2. Женатый, 3. Разведенный и т. Д.

с нетерпением жду вашей помощи

Ответы [ 2 ]

3 голосов
/ 30 мая 2019

Использовать DataFrame.replace со вложенными словарями - первый ключ определяет имя столбца для замены и другие значения для замены, созданные функцией Series.str.extract:

df = pd.DataFrame({'Gender':['1.Male','2.Female', np.nan],
                   'Ethnicity':['1.Chinese','2.Indian','3.Malay']})
print (df)
     Gender  Ethnicity
0    1.Male  1.Chinese
1  2.Female   2.Indian
2       NaN    3.Malay

d={x:df[x].str.extract(r'(\d+)\.(.+)').dropna().set_index(0)[1].to_dict() for x in df.columns}
print (d)
{'Gender': {'1': 'Male', '2': 'Female'}, 
 'Ethnicity': {'1': 'Chinese', '2': 'Indian', '3': 'Malay'}}

df1 = pd.DataFrame({'Gender':[2,1,2,1],
                   'Ethnicity':[1,2,3,1]})
print (df1)
   Gender  Ethnicity
0       2          1
1       1          2
2       2          3
3       1          1

#convert to strings before replace
df2 = df1.astype(str).replace(d)
print (df2)
   Gender Ethnicity
0  Female   Chinese
1    Male    Indian
2  Female     Malay
3    Male   Chinese
1 голос
/ 30 мая 2019

Если записи всегда в порядке (1.XXX,2.XXX...), используйте:

m=df1.apply(lambda x: x.str[2:])
n=df2.sub(1).replace(m)
print(n)

   gender ethderived
0  Female    Chinese
1    Male     Indian
2    Male      Malay
3  Female    Chinese
4    Male    Chinese
5  Female     Indian
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...