如何筛选 pandas 中的列表值

How to filter list value in pandas

我是这个网站和 Python 的新手,这个问题可能有点基础。

我有一个 pandas 系列,其中每一行都包含一个元素列表,我正在尝试过滤每个列表以仅保留给定列表中的元素。

reference_list = [item_a, item_c]

index       answers
 1       [item_a, item_b, item_c]
 2       [item_c, item_d, item_e]
 3       [item_a, item_c, item_b]

我正在寻找的输出看起来像这样

index       answers
 1       [item_a, item_c]
 2       [item_c]
 3       [item_a, item_c]

到目前为止,我已经尝试了 for 循环、pd.Series.apply(lambda x:) 函数和理解列表,但我没有得到我需要的结果。

如果有人能对我的错误提供进一步的见解,我将不胜感激。

也许你可以使用where函数。

pandas.where 祝你有美好的一天

您需要用过滤后的列覆盖该列或创建一个新列:

import pandas as pd

df =pd.DataFrame( {"answers":[ [1,2,3,4],[1,4],[1,3,42]] })

# keep only odd elements, put them into "filtered"
df["filtered"] = df["answers"].apply(lambda v : [a for a in v if a%2==1])

print(df)

输出:

        answers   filtered
0  [1, 2, 3, 4]     [1, 3]
1        [1, 4]        [1]
2    [1, 3, 42]     [1, 3]

用列表检查

检查map
df['new'] = df.answers.map(lambda x : [y for y in x if y in reference_list])

你可以试试:

df['answers'] = df['answers'].apply(lambda x: list(filter(lambda y: y in set(reference_list), x)))

使用 numpy 中的 'np.in1d' 函数进行过滤。

import numpy as np

for i in range(0, len(df['answers'])):
    df.iat[i, 0] = np.array(df.iat[i, 0])[np.in1d(df.iat[i, 0], reference_list)]

输出

            answers
1  [item_a, item_c]
2          [item_c]
3  [item_a, item_c]

使用 set 是另一种选择:

reference_set = set(reference_list)
df['new'] = df.answers.map(set).map(lambda x: x&reference_set).map(list)

>>> df
'''
                    answers               new
1  [item_a, item_b, item_c]  [item_a, item_c]
2  [item_c, item_d, item_e]          [item_c]
3  [item_a, item_c, item_b]  [item_a, item_c]