使用 pandas,我如何在我的列包含列表的位置定位一个值?

Using pandas, how do i loc a value where my column contains lists?

我有一个 df,有一列包含一个列表。 例如 -

df = pd.DataFrame({'name': ['name1', 'name2', 'name3', 'name4'],
                   'age': [21, 23, 24, 28],
                   'occupation': ['data scientist',  'doctor',  'data analyst', 'engineer'],
                   'knowledge':[['python','c++'], ['python', 'c#'], ['css','js','html'], ['c#']],
                  })

现在,我只想定位带有 'python' 作为列表中 'knowledge' 值之一的行。 我该怎么做?

我试过:pd.loc[(pd['knowledge'].isin['python'])] 但没成功

(编辑以修复代码)

您需要使用循环:

df[['python' in l for l in df['knowledge']]]

输出:

    name  age      occupation      knowledge
0  name1   21  data scientist  [python, c++]
1  name2   23          doctor   [python, c#]

备选方案

查找集合中的任意元素

保留至少有一个匹配项的行

search = set(['python', 'js'])
df[[bool(search.intersection(l)) for l in df['knowledge']]]

输出:

    name  age      occupation        knowledge
0  name1   21  data scientist    [python, c++]
1  name2   23          doctor     [python, c#]
2  name3   24    data analyst  [css, js, html]
匹配一个集合的所有元素

所有元素都需要匹配

search = set(['python', 'c++'])
df[[search <= set(l) for l in df['knowledge']]]

输出:

    name  age      occupation      knowledge
0 name1   21  data scientist  [python, c++]

您可以尝试将列表加入 space 分隔值,然后发现它包含您想要的带词边界的词。

m = df['knowledge'].str.join(' ').str.contains(r'\bpython\b')

或者你可以试试Series.apply

m = df['knowledge'].apply(lambda l: 'python' in l)
print(m)

0     True
1     True
2    False
3    False
Name: knowledge, dtype: bool

使用布尔索引对 select True

print(df[m])

    name  age      occupation      knowledge
0  name1   21  data scientist  [python, c++]
1  name2   23          doctor   [python, c#]