Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用dataframe.query从pd.dataframe中包含的列表中选择值_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

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