我的数据框为:
<table>
<tr>
<td><input type="checkbox" name="sd3" value="mfi_nam9" class="checkme" /></td>
<td>First Value</td>
<td><input type="number" name="mfi_nam9" class="text1 required" hidden></td>
<td>
<select name="ItemCode" class="text" hidden>
<option value="001">Item 1</option>
<option value="002">Item 2</option>
</select>
</td>
</tr>
<tr>
<td><input type="checkbox" name="sd3" value="mfi_nam9" class="checkme" /></td>
<td>First Value</td>
<td><input type="number" name="mfi_nam9" class="text1 required" hidden></td>
<td>
<select name="ItemCode" class="text" hidden>
<option value="001">Item 1</option>
<option value="002">Item 2</option>
</select>
</td>
</tr>
</table>
<script>
document.querySelectorAll('.checkme[type="checkbox"]').forEach(function (elem) {
elem.addEventListener('change', function () {
this.parentNode.parentNode.querySelector('.text1[type="number"]').hidden = !this.checked;
this.parentNode.parentNode.querySelector('select.text').hidden = !this.checked;
});
});
</script>
我的字典为:
df = pd.DataFrame(
{'title':['a1','a2','a3','a4','a5'],
'genre_name':[
['family', 'animation'],
['action', 'family', 'comedy'],
['family', 'comedy'],
['horror','action'],
['family', 'animation','comedy']]}
)
df
title genre_name
0 a1 ['family', 'animation']
1 a2 ['action', 'family', 'comedy']
2 a3 ['family', 'comedy']
3 a4 ['horror','action]
4 a5 ['family', 'animation','comedy']
我想创建一个称为'genre_ids'的新列,它将所有genre_names映射到字典'dict'中的键。
所需的df为:
dict={'1':'family','2':'animation','3':'action','4':'comedy','5':'horror'}
我该如何实现?
答案 0 :(得分:9)
将字典名称从dict
更改为另一个变量,因为内建函数(Python代码字),然后将键与列表推导中的值和映射值交换:
d={'1':'family','2':'animation','3':'action','4':'comedy','5':'horror'}
d1 = {v:k for k, v in d.items()}
df['genre_ids'] = df['genre_name'].apply(lambda x: [d1.get(y) for y in x])
#alternative
#df['genre_ids'] = [[d1.get(y) for y in x] for x in df['genre_name']]
print (df)
title genre_name genre_ids
0 a1 [family, animation] [1, 2]
1 a2 [action, family, comedy] [3, 1, 4]
2 a3 [family, comedy] [1, 4]
3 a4 [horror, action] [5, 3]
4 a5 [family, animation, comedy] [1, 2, 4]
编辑:您还可以指定如果不匹配将发生什么情况,在这里为第一个列表添加crime
:
df = pd.DataFrame({'title':['a1','a2','a3','a4','a5'],
'genre_name':[['crime', 'animation'],['action', 'family', 'comedy'],
['family', 'comedy'],['horror','action'],
['family', 'animation','comedy']]})
d={'1':'family','2':'animation','3':'action','4':'comedy','5':'horror'}
d1 = {v:k for k, v in d.items()}
#no matched values repalced to None
df['genre_ids0'] = df['genre_name'].apply(lambda x: [d1.get(y) for y in x])
#no match replaced to default value
df['genre_ids1'] = df['genre_name'].apply(lambda x: [d1.get(y, 0) for y in x])
#no match is removed
df['genre_ids2'] = df['genre_name'].apply(lambda x: [d1[y] for y in x if y in d1])
print (df)
title genre_name genre_ids0 genre_ids1 genre_ids2
0 a1 [crime, animation] [None, 2] [0, 2] [2]
1 a2 [action, family, comedy] [3, 1, 4] [3, 1, 4] [3, 1, 4]
2 a3 [family, comedy] [1, 4] [1, 4] [1, 4]
3 a4 [horror, action] [5, 3] [5, 3] [5, 3]
4 a5 [family, animation, comedy] [1, 2, 4] [1, 2, 4] [1, 2, 4]