繁体   English   中英

Map df array column with dict

[英]Map df array column with dict

我有一个 dataframe,其中包含 arrays 的列:

id_food1    id_food2
[1]       NaN
[2]       NaN
[2 3]     [1]

我想将 map 这些列添加到具有值的字典中:

food_dict = {1: 'cake', 
               2: 'choco', 
               3: 'cream'}

我想要这样的东西:

id_food1    id_food2  id_food1_name  id_food2_name
[1]       NaN.        [cake]          0
[2]       NaN         [choco]        0
[2 3]     [1]          [choco,cream] [cake]

当列不是这样的数组时,我知道该怎么做

data['id_food1_name'] = data['id_food1'].map(food_dict)

但是当它是一个数组时无法做到这一点。

任何帮助将不胜感激

使用Series.explode来展平值、映射和最后一个聚合列表预索引:

data['id_food1_name'] = (data['id_food1'].explode().astype(float)
                                  .map(food_dict).groupby(level=0).agg(list))

对于所有列:

#converting strings to lists
import ast

c = ['id_food1', 'id_food2']

def f(x):
    try:
        return ast.literal_eval(x)
    except:
        return np.nan
data[c] = data[c].applymap(f)

转换为列表的替代解决方案:

data[c] = data[c].stack().str.strip('[]').str.split().unstack()

然后映射

for x in c:
    f = lambda x: [food_dict.get(int(y)) for y in x if int(y) in food_dict]
    data[f'{x}_name'] = data[x].dropna().apply(f)
    data[f'{x}_name'] = data[f'{x}_name'].fillna(0)
print (data)
  id_food1 id_food2   id_food1_name id_food2_name
0      [1]      NaN          [cake]             0
1      [2]      NaN         [choco]             0
2   [2, 3]      [1]  [choco, cream]        [cake]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM