将字典值映射到数据框列中的键值

时间:2020-01-16 10:56:37

标签: python pandas dictionary

我有一个数据框:

values
 NaN
 NaN
 [1,2,5]
 [2]
 [5]

还有字典

{nan: nan,
'1': '10',
 '2': '11',
 '5': '12',}

数据框包含字典中的键。

如何用同一词典中的相应值替换这些键?

输出:

values
 NaN
 NaN
 [10,11,12]
 [11]
 [12]

我尝试过

so_df['values'].replace(my_dictionary, inplace=True)
so_df.head()

3 个答案:

答案 0 :(得分:3)

您可以使用pandas df的apply()方法。检查以下实现:

import pandas as pd
import numpy as np

df = pd.DataFrame([np.nan,
 np.nan,
 ['1', '2', '5'],
 ['2'],
 ['5']], columns=['values'])

my_dict = {np.nan: np.nan,
 '1': '10',
 '2': '11',
 '5': '12'}

def update(row):
    if isinstance(row['values'], list):
        row['values'] = [my_dict.get(val) for val in row['values']]
    else:
        row['values'] = my_dict.get(row['values'])
    return row

df = df.apply(lambda row: update(row), axis=1)

简单的实现。只要确保您的数据框包含字符串,字典关键字也包含字符串即可。

答案 1 :(得分:1)

设置

import numpy as np
df=pd.DataFrame({'values':[np.nan,np.nan,[1,2,5],[2],5]})
my_dict={np.nan: np.nan, '1': '10', '2': '11', '5': '12'}

Series.explodeSeries.map一起使用

df['values']=( df['values'].explode()
                       .astype(str)
                       .map(my_dict)
                       .dropna()
                       .astype(int)
                       .groupby(level = 0)
                       .agg(list) )

如果您的值列中还有其他字符串,则您需要将pd.to_numericerrors = coerce配合使用,以保持此字符串,您应该这样做:

df['values']=(pd.to_numeric( df['values'].explode()
                                         .astype(str)
                                         .replace(my_dict),
                             errors = 'coerce')
                .dropna()
                .groupby(level = 0)
                .agg(list) 
                .fillna(df['values'])
               )

输出

         values
0           NaN
1           NaN
2  [10, 11, 12]
3          [11]
4          [12]

更新

没有explode

的解决方案
df['values']=(pd.to_numeric( df['values'].apply(pd.Series)
                                         .stack()
                                         .reset_index(level=1,drop=1)
                                         .astype(str)
                                         .replace(my_dict),
                         errors = 'coerce')
                 .dropna()
                 .groupby(level = 0)
                 .agg(list) 
                 .fillna(df['values'])
         )

答案 2 :(得分:1)

尝试:

df['values']=pd.to_numeric(df['values'].explode().astype(str).map(my_dict), errors='coerce').groupby(level=0).agg(list)