我正在尝试创建一个新列(位置(,详细说明名称列表中每个名称的索引位置。
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((应用于数据帧中的列表的具体内容。
提前感谢
如果值总是匹配,请使用.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