如何筛选 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]
我是这个网站和 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]