为什么此pandas df.loc()调用选择仅满足一个条件而不同时满足两个条件的所有记录?

时间:2020-03-10 15:47:31

标签: pandas

所以我有这个数据框

# list of strings 
lst = ['Geeks', 'For', 'Geeks', 'is', 'portal', 'for', 'Geeks'] 

# list of int 
lst2 = ["gdadsf", '23', 'gggg', '22', 'df', '66', '77'] 

# Calling DataFrame constructor after zipping 
# both lists, with columns specified 
df = pd.DataFrame(list(zip(lst, lst2)), 
            columns =['Name', 'val']) 
df.loc[(df['Name']=='Geeks')&('gggg' in df['val'].to_string())]

,结果如下所示,它选择了包含Geeks的所有行,而不仅仅是第2行

0   Geeks   gdadsf
2   Geeks   gggg
6   Geeks   77

更新:这是How do I test if a string is in a cell of a pandas data frame, cell that contains a list of strings?

引起的延续或问题。

Update2:如果我将其与上述其他问题联系起来,我的查询无济于事。请注意现在存储在单元格中的字符串列表

# list of strings 
lst = ['Geeks', 'For', 'Geeks', 'is', 'portal', 'for', 'Geeks'] 
# list of int 
lst2 = [["gdadsf",'jjjj'], ['23'], ['gggg','hhh'], ['22'], ['df'], ['66'], ['77','zzz'] ]
# Calling DataFrame constructor after zipping 
# both lists, with columns specified 
df = pd.DataFrame(list(zip(lst, lst2)), 
            columns =['Name', 'val']) 
df.loc[(df['Name']=='Geeks')&(df['val'].str.contains('gggg'))]

2 个答案:

答案 0 :(得分:0)

to_string()将所有内容连接为一个长字符串。本质上,您的代码是

df.loc[(df['Name']=='Geeks')& True]

这将为您提供所有具有Name等于'Geeks'的行。所以你不想要那个,你想要的:

df.loc[(df['Name']=='Geeks')&( df['val'].str.contains('gggg'))]

答案 1 :(得分:0)

在您的情况下,每次都是如此,因为隶属度函数in每次都会求值为True

您应该添加类似的条件,检查是否等于值。如下所示。

print(df.loc[(df['Name']=='Geeks')&(df['val']=='gggg')])

如果要检查and条件中有多个值,请使用isin,如下所示。

print(df.loc[(df['Name']=='Geeks')&(df.val.isin(['gggg','77']))])