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