Заменить значения в Dataframe с использованием Lookup Dataframe - PullRequest
0 голосов
/ 02 ноября 2018

Я хочу заменить значения в кадре данных df , используя lookup dataframe.

import pandas as pd

df=pd.DataFrame({
                  'no1':[20,20,40,10,50],
                  'no2':[50,20,10,40,50],
                  'no3':[30,10,50,40,50]
                  })

   no1  no2 no3
0   20  50  30
1   20  20  10
2   40  10  50
3   10  40  40
4   50  50  50

lookup=pd.DataFrame({'label':['A','B','C','D','E'],
                  'id':[10,20,30,40,50]})

    label id
0   A     10
1   B     20
2   C     30
3   D     40
4   E     50

В частности, я хотел бы иметь:

   no1  no2 no3
0   B   E   C
1   B   B   A
2   D   A   E
3   A   D   D
4   E   E   E

Как лучше всего делать это с помощью панд?

P.S .: Я нашел очень похожий вопрос в этом документе, но я не совсем понимаю, как это делается в R. Решение Python приветствуется.

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Вы можете использовать заменить со словарем:

import pandas as pd

df=pd.DataFrame({
                  'no1':[20,20,40,10,50],
                  'no2':[50,20,10,40,50],
                  'no3':[30,10,50,40,50]
                  })

lookup=pd.DataFrame({'label':['A','B','C','D','E'],
                  'id':[10,20,30,40,50]})

result = df.replace(dict(zip(lookup.id, lookup.label)))

print(result)

выход

  no1 no2 no3
0   B   E   C
1   B   B   A
2   D   A   E
3   A   D   D
4   E   E   E
0 голосов
/ 02 ноября 2018

Вы можете создать словарь и затем использовать np.vectorize:

d = lookup.set_index('id')['label'].to_dict()
df.iloc[:] = np.vectorize(d.get)(df.values)

print(df)

  no1 no2 no3
0   B   E   C
1   B   B   A
2   D   A   E
3   A   D   D
4   E   E   E
0 голосов
/ 02 ноября 2018

Первое создание Series от set_index.

Используйте replace, но оно должно быть медленным в больших DataFrame:

s = lookup.set_index('id')['label']
df = df.replace(s)

Решения для None или NaN s для несогласованных значений с applymap или apply с map:

df = df.applymap(s.get)

Или:

df = df.apply(lambda x: x.map(s))

Или:

for c in df.columns:
    df[c] = df[c].map(s)

print (df)
  no1 no2 no3
0   B   E   C
1   B   B   A
2   D   A   E
3   A   D   D
4   E   E   E
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...