首页 > 解决方案 > 识别数据框中列表中的字符串位置

问题描述

我正在尝试在名称列表中创建一个新列(位置),详细说明每个名称的索引位置。

df = pd.DataFrame({'name': ['a', 'b', 'c', 'd', 'e'], 'names' : [['a','b','c'], ['a','b'], ['c','d','a'], ['b','a','d','c','e'], ['e','a']], 'position':[0,1,0,2,0]})

我试过用......转换为布尔值

df['match'] = (df.apply(lambda x: [x['name'] == m for m in x['names']], axis=1))

但仍然无法得到我想要的答案。

我浏览了许多帖子,但找不到任何特定于将 index() 应用于数据框中的列表的内容。

提前致谢

标签: pythonpandas

解决方案


如果值总是匹配使用.index

df['match'] = (df.apply(lambda x: x['names'].index(x['name']), axis=1))
print (df)
  name            names  position  match
0    a        [a, b, c]         0      0
1    b           [a, b]         1      1
2    c        [c, d, a]         0      0
3    d  [b, a, d, c, e]         2      2
4    e           [e, a]         0      0

如果可能没有匹配,则使用生成器理解的解决方案,next如果没有匹配,则使用默认值,这里-1

#changed data
df = pd.DataFrame({'name': ['r', 'b', 'c', 'd', 'e'], 
                   'names' : [['a','b','c'], ['a','b'], ['c','d','a'],
                              ['b','a','d','c','e'], ['e','a']],  
                    'position':[0,1,0,2,0]})

f = lambda x: next((i for i, m in enumerate(x['names']) if x['name'] == m), -1)
df['match'] = df.apply(f, axis=1)
print (df)
  name            names  position  match
0    r        [a, b, c]         0     -1
1    b           [a, b]         1      1
2    c        [c, d, a]         0      0
3    d  [b, a, d, c, e]         2      2
4    e           [e, a]         0      0

推荐阅读