Python 使用dataframe.query从pd.dataframe中包含的列表中选择值
我想提取/过滤包含列表上字符串的数据帧行,在这种情况下,我尝试使用查询,因为它们通常非常适合此工作,并且代码非常优雅,我尝试过:Python 使用dataframe.query从pd.dataframe中包含的列表中选择值,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我想提取/过滤包含列表上字符串的数据帧行,在这种情况下,我尝试使用查询,因为它们通常非常适合此工作,并且代码非常优雅,我尝试过: my_list = ['red', 'blue', 'green', 'yellow'] df_new = df.query("`User Color` in @my_list") 我正在寻找一个函数,如果包含字符串,它的工作方式与中类似 我的数据帧df看起来有点像这样: name id User Color Age L
my_list = ['red', 'blue', 'green', 'yellow']
df_new = df.query("`User Color` in @my_list")
我正在寻找一个函数,如果包含字符串,它的工作方式与中类似
我的数据帧df看起来有点像这样:
name id User Color Age
Luis 876 blue, green 35
Charles 12 blue, brown 34
Luna 654 black 24
Anna 987 brown 19
Silvana 31 red, black 26
Juliet 55 red 20
我期望的结果应该是:
name id User Color Age
Luis 876 blue, green 35
Charles 12 blue, brown 34
Silvana 31 red, black 26
Juliet 55 red 20
您需要拆分每行中的值,并检查所选列表中是否存在这些值 这可以通过map函数来完成
df_subset = df[df['User Color'].map(lambda val: any(x in my_list for x in val.split(',')))]
因为它是字符串匹配,所以根据您的需求考虑条带化和降低分割值。
与上述代码类似,但具有描述性:def filter_color(val):
for x in val.split(','):
if x.lower().strip() in my_list:
return True
return False
df_subset = df[df['name'].map(filter_color)]
不必拆分dataframe列,您可以执行相反的操作,即加入列表。可以将join与str.contains一起使用。注意:这不太可靠,因为它不会提供直接匹配:
使用查询方法构建@DavidErickson的解决方案:
df_subset=df[df['User Color'].maplambda val:anyx在我的_列表中,对于val.split'中的x,“]这应该可以做到^^^^^^ val.split',”:感谢@DavidErickson指出这一点。非常感谢!这也是一个很好的答案,即使它不是精确地使用查询方法。我也试过了,效果不错。我真的很感激
df[df['User Color'].str.contains('|'.join(my_list))]
Out[1]:
name id User Color Age
0 Luis 876 blue, green 35
1 Charles 12 blue, brown 34
4 Silvana 31 red, black 26
5 Juliet 55 red 20
df.query("`User Color`.str.contains('|'.join(@my_list))")
name id User Color Age
0 Luis 876 blue, green 35
1 Charles 12 blue, brown 34
4 Silvana 31 red, black 26
5 Juliet 55 red 20