我有一个系列
8 [11820]
9 [11820]
10 [11820]
11 [11820]
12 [11820]
27 [10599]
28 [10599]
29 [10599]
31 [661, 10599]
32 [661, 10599]
33 [7322]
34 [0]
37 [661]
39 [661]
40 [661]
49 [0, 661, 662, 663]
我想用points[points.isin([0])]
之类的东西来过滤该系列以获得
34 [0]
49 [0, 661, 662, 663]
但是我得到0个功能。
答案 0 :(得分:1)
一种简单的检查值(0)是否在列表中的方法是,使用系列中的apply
:
s = s[s.apply(lambda x: 0 in x)]
一些解释:
对于它检查的每一行,列表中是否为0。
Apply返回一个“ True / False”系列,其中对于每一行,True表示该行内的列表中为0。
此后,您的第一个(一个或多个)系列将通过[]被此“ True / False”系列过滤。
示例代码:
# This is your series
s = pd.Series([[0],
[11820],
[11820],
[10599],
[0, 661, 662, 663]])
# This is the solution
s = s[s.apply(lambda x: 0 in x)]
# Print the result
print(s)
0 [0]
4 [0, 661, 662, 663]
Name: A, dtype: object
答案 1 :(得分:1)
pd.Series.isin
通过散列工作,并且在整个元素上工作,即不会考虑部分匹配。即使是完全匹配,由于不能对列表进行散列,pd.Series.isin
也不能用于一系列列表。
您可以对pd.Series.apply
使用自定义函数:
df = pd.DataFrame({'A': [[1, 2], [0], [0, 2, 3]]})
search_list = [0] # list of scalars
mask = df['A'].apply(lambda x: any(i in x for i in search_list))
res = df[mask]
print(res)
A
1 [0]
2 [0, 2, 3]
在进行任何比较之前,您可以将序列转换为可哈希的元组。然后将您的元组系列与元组列表进行比较。
search_list = [[0]] # list of lists
mask = df['A'].map(tuple).isin(list(map(tuple, search_list)))
res = df[mask]
print(res)
A
1 [0]
使用object
dtype系列的Note操作必然效率低下。如果可能,您应该将一系列列表拆分为多个整数系列。尽管在这种情况下,鉴于列表长度不一致,这可能很麻烦。