Загрузка значений словаря в значения строк информационного кадра в пандах - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть словарь Python

{1:cat,
  2:dog,
  3:sheep,
  4:foo,
  5:bar,
  6:fish,
  7:lion,
  8:shark,
  9:zebra,
  10:snake}

Также у меня pandas dataframe, как указано ниже df:

ID    col1    col2    col2   col4
18938   1       Nan     5      Nan
17839  Nan      2      Nan     8
72902   3       5       9      Nan
78298   7       Nan    Nan     6

Теперь я пытаюсь заменить или отобразить значения каждой ячейкив каждом столбце значения словаря и пытается concat все значения столбца в новый столбец.

Новый df должен выглядеть следующим образом:

ID    col1    col2    col2   col4     new_col
18938  cat      Nan    bar     Nan     cat|bar
17839  Nan      dog    Nan    shark    dog|shark
72902  sheep    bar   zebra    Nan    sheep|bar|zebra
78298  lion     Nan    Nan    fish     lion|fish

Я пытаюсь выполнить 2-й шаг, который состоит из concat всех столбцов с использованием кода

df['new_col'] = df.drop('ID',1).agg(lambda x: '|'.join(x.dropna().astype(str).values), axis=1)

но я не могу заставить работать первый шаг

Я использовал

df = df.columns.map(dict)

, но он не дает мне ожидаемого ответа, который мне нужен.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Вы можете попробовать это:

df = df.set_index('ID')
d1 = pd.concat([df[i].replace('Nan',pd.np.nan).dropna().astype(int).map(d) for i in df.columns], axis=1)
d1['new_col'] = d1.apply(lambda x: '|'.join(x.dropna()), axis=1)
print(d1)

Или если вы хотите немного медленнее, но более лаконичный код:

d1 = df.apply(lambda x: x.replace('Nan',pd.np.nan).dropna().astype(int).map(d))
d1['new_col'] = d1.apply(lambda x: '|'.join(x.dropna()), axis=1)
d1

Вывод:

        col1 col2 col2.1   col4          new_col
ID                                              
17839    NaN  dog    NaN  shark        dog|shark
18938    cat  NaN    bar    NaN          cat|bar
72902  sheep  bar  zebra    NaN  sheep|bar|zebra
78298   lion  NaN    NaN   fish        lion|fish
0 голосов
/ 01 февраля 2019

Использование df.replace():

df = df.replace(dict)

Обратите внимание, что если ключи в вашем словаре являются строками, вам может понадобиться regex=True:

df = df.replace(dict, regex=True)

Пример:

import pandas as pd

d = {1:"cat",
  2:"dog",
  3:"sheep",
  4:"foo",
  5:"bar",
  6:"fish",
  7:"lion",
  8:"shark",
  9:"zebra",
  10:"snake"}

df = pd.DataFrame({'ID': [123, 456], 'col1': [1, 2], 'col2': [5, 6]})
df = df.replace(d)

print(df)

Выход:

    ID col1  col2
0  123  cat   bar
1  456  dog  fish
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...