将字典值加载到熊猫数据框的行值中

时间:2019-01-31 21:19:58

标签: python pandas dictionary dataframe

我有一个python字典

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

我也有如下熊猫数据框 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

我正在尝试实现第二步,即使用代码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 :(得分:2)

使用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

答案 1 :(得分:2)

您可以尝试以下方法:

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