我有一個包含陣列列的資料框:
id_food1 id_food2
[1] NaN
[2] NaN
[2 3] [1]
我想將這些列映射到具有值的字典:
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)
但是當它是一個陣列時無法做到這一點。
任何幫助將不勝感激
uj5u.com熱心網友回復:
用于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]
uj5u.com熱心網友回復:
您可以使用 dict 理解,其中您explode map groupby agg(list)(使用 if-else 將 NaN 轉換為 0);然后assign它回到df.
df = (df.assign(**{f'id_food{i}_name': df[f'id_food{i}']
.explode()
.map(food_dict)
.groupby(level=0)
.agg(lambda x: x.tolist() if x.notna().all() else 0)
for i in range(1,df[['id_food1','id_food2']].shape[1] 1)}))
輸出:
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]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/424789.html
