Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.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 通过运行多个搜索筛选数据集中的行_Python_Pandas - Fatal编程技术网

Python 通过运行多个搜索筛选数据集中的行

Python 通过运行多个搜索筛选数据集中的行,python,pandas,Python,Pandas,我需要创建一个函数,使我能够过滤数据集中的行,然后创建一个新的过滤数据集,其中只包括原始数据集中的那些行(和所有列),或者,如果我不想过滤它们,则返回我的原始数据集。 数据集示例如下(列名称相同,但行中的值不同): (一) (二) 我所做的工作如下: list_datasets=[] for i in range(0,2): # I have two datasets that I want to check individually. For each of them, I need to

我需要创建一个函数,使我能够过滤数据集中的行,然后创建一个新的过滤数据集,其中只包括原始数据集中的那些行(和所有列),或者,如果我不想过滤它们,则返回我的原始数据集。
数据集示例如下(列名称相同,但行中的值不同):

(一)

(二)

我所做的工作如下:

list_datasets=[]

for i in range(0,2): # I have two datasets that I want to check individually. For each of them, I need to specify key words to filter: key word 'Mary' from the first dataset; key words ' Kim Jun' from the second dataset, ...

    key_words = [] 

    while True:
        words = input("Search: ")

        if query!='-0':
            key_words.append(words)
            df[str(i)]["Key_Word"]= df[str(i)].Names.str.contains('|'.join(key_words), case=False, regex=True)
            df[str(i)].loc[df[str(i)]["Key_Word"] != False]
        elif words=='-0':
            break
        filt=df[str(i)][df[str(i)]["Key_Word"] != False].copy()
        list_datasets.append(filt)  
当我不想检查一个或多个数据集的任何值时,即当我想保留原始数据集时,我遇到了一些问题。 当我尝试打印数据集时出现错误:

for i in range(0,2):
    print(list_datasets[i]) 
详情如下:

IndexError                                Traceback (most recent call last)
<ipython-input-27-e490745a8a26> in <module>
     26 
     27 for i in range(0,2):
    ---> 28     print(list_datasets[i])

IndexError: list index out of range
索引器错误回溯(最近一次调用)
在里面
26
27对于范围(0,2)内的i:
--->28打印(列出数据集[i])
索引器:列表索引超出范围
我只使用csv文件

任何帮助都将不胜感激。谢谢

更新

逻辑应该如下。对于每个数据集:

  • 选择是否过滤(是/否)
  • 如果我选择y,那么我需要选择关键字来过滤行。然后返回过滤后的数据集
  • 如果选择n,则过滤后的数据集应等于原始数据集

请让我知道,如果这没有意义,你需要更多的信息。谢谢

下面是一些示例代码,它以我在上面的评论中描述的方式过滤数据帧。特定的用例是在一个列表中搜索两个数据帧以获得一个值列表(关键字)。我制作了两个示例数据帧,并使用了您的列

这并不是对你问题的所有方面的完整回答,但我希望它能让你找到一个完整的解决方案

import pandas as pd

list_datasets = []

# data in the form of list of tuples 
data1 = [('Peter', 'Smith', 'peters@example.com', 'Calgary'), 
         ('Riff', 'Jones', 'riffj@example.com', 'Ontario'), 
         ('John', 'Brown', 'johnb@example.com', 'Manitoba'),
         ('Michel', 'Boudreaux', 'michelb@example.com', 'Montreal')]

data2 = [('Sven', 'Erikson', 'svene@example.com', 'Omaha'), 
         ('Mary', 'Brown', 'maryb@example.com', 'Chicago'), 
         ('Erik', 'Svenson', 'eriks@example.com', 'Dallas'),
         ('Cindy Lou', 'Who', 'cindylouw@example.com', 'Whoville')]

# create DataFrame using data 
df1 = pd.DataFrame(data1, columns =['Name', 'Surname', 'Email', 'City'])
df2 = pd.DataFrame(data2, columns =['Name', 'Surname', 'Email', 'City'])

print("Dataframe1:\n", df1)
print("Dataframe2:\n", df2)

list_datasets.append(df1)
list_datasets.append(df2)
# print out complete dataframes in list
# for dfi in list_datasets:
#     print("Input dataset contains:\n", dfi)

searchfield = "City"
searchlist = ['Ontario', 'Manitoba', 'Chicago', 'Dallas']
searchstr = "|".join(searchlist)
print("We will be searching for the following values:\n", searchstr)

dfout = []
for dfi in list_datasets:
    dfcopy = dfi.loc[dfi[searchfield].str.contains(searchstr, case=False, regex=True)]
    dfout.append(dfcopy)

for dfi in dfout:
    print("Result from dataset:\n", dfi)
输出:

Dataframe1:
      Name    Surname                Email      City
0   Peter      Smith   peters@example.com   Calgary
1    Riff      Jones    riffj@example.com   Ontario
2    John      Brown    johnb@example.com  Manitoba
3  Michel  Boudreaux  michelb@example.com  Montreal
Dataframe2:
         Name  Surname                  Email      City
0       Sven  Erikson      svene@example.com     Omaha
1       Mary    Brown      maryb@example.com   Chicago
2       Erik  Svenson      eriks@example.com    Dallas
3  Cindy Lou      Who  cindylouw@example.com  Whoville
We will be searching for the following values:
 Ontario|Manitoba|Chicago|Dallas
Result from dataset:
    Name Surname              Email      City
1  Riff   Jones  riffj@example.com   Ontario
2  John   Brown  johnb@example.com  Manitoba
Result from dataset:
    Name  Surname              Email     City
1  Mary    Brown  maryb@example.com  Chicago
2  Erik  Svenson  eriks@example.com   Dallas

您是否考虑过使用loc()以正则表达式的形式使用与搜索值匹配的命名列来过滤数据帧?您可以使用loc()和copy()从原始数据帧创建新的数据帧。Hi BaloonRM。我在代码中使用loc()和copy()从原始数据帧创建了一个新的数据帧(对于每个数据集;我不想要唯一的数据集,但对于每个数据集/csv文件都要一个)。你是说这个吗?其中df是原始数据帧,dfcopy是过滤后的副本,searchstr是搜索字符串,类似于:dfcopy=df.loc[df['Key\u Word]==searchstr].copy()我使用了简单的字符串等价,但可以扩展到contains。它是否也适用于
df[str(I)]
其中
i
1
运行到
n
i
是我的数据集的索引)?我以前在这方面遇到过一些问题。我从未使用过数据帧列表,但在datafame列表上进行迭代可能比使用索引进行迭代效果更好。类似于列表_数据集中的dfi:其中dfi是第i个数据帧。这将消除需要处理索引的混乱。您还可以假定将每个dfi副本.append()添加到数据帧的输出列表中。非常感谢您的支持。我会想办法把它应用到我的案例中。谢谢你的时间和回答。不客气。您还将注意到,我注释掉了代码(对于list_datesets:中的dfi),该代码将从迭代中得到的错误消息处理为“for I in range(0,2)”
import pandas as pd

list_datasets = []

# data in the form of list of tuples 
data1 = [('Peter', 'Smith', 'peters@example.com', 'Calgary'), 
         ('Riff', 'Jones', 'riffj@example.com', 'Ontario'), 
         ('John', 'Brown', 'johnb@example.com', 'Manitoba'),
         ('Michel', 'Boudreaux', 'michelb@example.com', 'Montreal')]

data2 = [('Sven', 'Erikson', 'svene@example.com', 'Omaha'), 
         ('Mary', 'Brown', 'maryb@example.com', 'Chicago'), 
         ('Erik', 'Svenson', 'eriks@example.com', 'Dallas'),
         ('Cindy Lou', 'Who', 'cindylouw@example.com', 'Whoville')]

# create DataFrame using data 
df1 = pd.DataFrame(data1, columns =['Name', 'Surname', 'Email', 'City'])
df2 = pd.DataFrame(data2, columns =['Name', 'Surname', 'Email', 'City'])

print("Dataframe1:\n", df1)
print("Dataframe2:\n", df2)

list_datasets.append(df1)
list_datasets.append(df2)
# print out complete dataframes in list
# for dfi in list_datasets:
#     print("Input dataset contains:\n", dfi)

searchfield = "City"
searchlist = ['Ontario', 'Manitoba', 'Chicago', 'Dallas']
searchstr = "|".join(searchlist)
print("We will be searching for the following values:\n", searchstr)

dfout = []
for dfi in list_datasets:
    dfcopy = dfi.loc[dfi[searchfield].str.contains(searchstr, case=False, regex=True)]
    dfout.append(dfcopy)

for dfi in dfout:
    print("Result from dataset:\n", dfi)
Dataframe1:
      Name    Surname                Email      City
0   Peter      Smith   peters@example.com   Calgary
1    Riff      Jones    riffj@example.com   Ontario
2    John      Brown    johnb@example.com  Manitoba
3  Michel  Boudreaux  michelb@example.com  Montreal
Dataframe2:
         Name  Surname                  Email      City
0       Sven  Erikson      svene@example.com     Omaha
1       Mary    Brown      maryb@example.com   Chicago
2       Erik  Svenson      eriks@example.com    Dallas
3  Cindy Lou      Who  cindylouw@example.com  Whoville
We will be searching for the following values:
 Ontario|Manitoba|Chicago|Dallas
Result from dataset:
    Name Surname              Email      City
1  Riff   Jones  riffj@example.com   Ontario
2  John   Brown  johnb@example.com  Manitoba
Result from dataset:
    Name  Surname              Email     City
1  Mary    Brown  maryb@example.com  Chicago
2  Erik  Svenson  eriks@example.com   Dallas