【问题标题】:Python Pandas Series.isin doesn't workPython Pandas Series.isin 不起作用
【发布时间】:2018-08-10 19:33:50
【问题描述】:

我有一个系列

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

【问题讨论】:

标签: python pandas series


【解决方案1】:

检查您的值 (0) 是否在列表中的简单方法是在您的系列上使用 apply

s = s[s.apply(lambda x: 0 in x)]

一些解释:
对于它检查的每一行,0 是否在列表中。

Apply 返回一个“True/False”系列,其中对于每一行 True 表示 0 在行内的列表中。

之后,您的第一个系列将通过 [] 被这个“真/假”系列过滤。

示例代码:

# 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

【讨论】:

    【解决方案2】:

    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 系列的笔记操作必然是低效的。如果可能,您应该将一系列列表拆分为多个整数系列。尽管在这种情况下,考虑到不一致的列表长度,这可能会很麻烦。

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 2016-09-01
      • 2013-04-24
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多