0

我有一个名为(mylist)的 4,300 个名字的列表

我有一个包含 3,130 行的数据框 (df) 列 (col1)。每行都包含一个名称列表。

我想从 mylist 中找到包含值的每一行。

我尝试了 3 种方法,但它们似乎都给了我错误的答案。

1)

mask = df[col1].apply(lambda x: any(name in x for name in mylist)) 
   df1 = df[mask] 

2)

row_containing_unique = list() 

    for row in df[col1]:
        for name in mylist: 
           if name in row: 
            row_containing_unique.append(row)

3)

for name in mylist:
      if name in mylist: 
         mask = df[col1].isin(mylist)
         df1 = df[mask]

预期的结果是一个数据框,其中每一行都有一个来自 mylist 的值。

4

2 回答 2

0

注意,这是代替一串注释

当接受合适的答案或 OP 提供澄清时,我将删除它。

根据问题的措辞,您有一个包含单列的数据框,每一行都是一个名称列表。您正在尝试根据行需要包含至少一个主列表中的名称的条件过滤掉行。

根据该描述,我得出的解决方案与您在选项 1 中提供的解决方案相同:

import pandas as pd
import random

lst = ['john', 'mike', 'jen', 'april', 'rita', 'aaron', 'brian']
other_names = ['carter', 'mckenzie', 'tyler', 'erick', 'holly'] + lst
# will now contain lists of varying length
df = pd.DataFrame([[[random.choice(other_names) for i in range(random.randint(1,5))]] for i in range(25)], columns=['names'])

df.head(5)
                           names
0                        [erick]
1             [rita, aaron, jen]
2    [aaron, tyler, brian, rita]
3                         [john]
4  [carter, holly, erick, aaron]



# for y in x is iterating over the list in each row
df.loc[df['names'].apply(lambda x: any(y in lst for y in x))]
                                    names
1                      [rita, aaron, jen]
2             [aaron, tyler, brian, rita]
3                                  [john]
4           [carter, holly, erick, aaron]
5                                  [john]

# and to show the converse, no membership in lst
df.loc[df['names'].apply(lambda x: not any(y in lst for y in x))]
             names
0          [erick]
16         [tyler]
21         [tyler]
22  [erick, tyler]
23         [erick]

您能否提供一些示例数据、解决方案的实际输出和预期输出?否则,我们将无法提供帮助

于 2019-07-17T19:34:29.837 回答
0

这是我尝试在系列和names列表行中的每个列表上设置交集的方法。希望这有助于解决您的问题。

In [12]: df = pd.DataFrame({'A':[['john','sam','tim'], ['vicki', 'tom', 'val'], ['mike', 'bob', 'sean'], ['dean','kevin
    ...: ', 'sandra']], 'B':[5,6,7,8]})

In [13]: df
Out[13]:
                       A  B
0       [john, sam, tim]  5
1      [vicki, tom, val]  6
2      [mike, bob, sean]  7
3  [dean, kevin, sandra]  8

In [14]: names = ['john','tom', 'sean']

In [43]: df[df.A.apply(lambda x:any(set(x).intersection(names)))]
Out[43]:
                   A  B
0   [john, sam, tim]  5
1  [vicki, tom, val]  6
2  [mike, bob, sean]  7       
于 2019-07-17T20:03:00.393 回答