Python Pandas Series.isin不起作用

时间:2018-08-10 09:10:46

标签: python pandas series

我有一个系列

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个功能。

2 个答案:

答案 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操作必然效率低下。如果可能,您应该将一系列列表拆分为多个整数系列。尽管在这种情况下,鉴于列表长度不一致,这可能很麻烦。