我有一个名为(mylist)的4,300个名字的列表
我有一个包含3130行的数据框(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中的值。
答案 0 :(得分: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]
能否提供一些样本数据,解决方案的实际输出以及预期的输出?否则,我们将无法提供帮助
答案 1 :(得分: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