[英]How to filter and sort specific csv using python
请帮助我使用 python 脚本过滤以下 CSV。 下面是我已经完成初始过滤的 CSV 转储示例。
姓 | 性别 | 姓名 | 电话 | 城市 |
---|---|---|---|---|
福特 | 男性 | 汤姆 | 123 | 纽约 |
富有的 | 男性 | 罗伯特 | 21312 | 洛杉矶 |
福特 | 女性 | 杰西卡 | 123123 | 纽约 |
福特 | 男性 | 约翰 | 3412 | 纽约 |
富有的 | 其他 | 琳达 | 12312 | 洛杉矶 |
福特 | 其他 | 詹姆士 | 4321 | 纽约 |
史密斯 | 男性 | 大卫 | 123123 | 德克萨斯州 |
富有的 | 女性 | 玛丽 | 98689 | 洛杉矶 |
富有的 | 女性 | 珍妮弗 | 86860 | 洛杉矶 |
福特 | 男性 | 理查德 | 12123 | 纽约 |
史密斯 | 其他 | 丹尼尔 | 897097 | 德克萨斯州 |
福特 | 其他 | 丽莎 | 123123123 | 纽约 |
import re
def gather_info (L_name):
dump_filename = "~/Documents/name_report.csv"
LN = []
with open(dump_filename, "r") as FH:
for var in FH.readlines():
if L_name in var
final = var.split(",")
print(final[1], final[2], final[3])
return LN
if __name__ == "__main__":
L_name = input("Enter the Last name: ")
la_name = gather_info(L_name)
这样,我就可以按姓氏进行过滤。 例如,如果我选择 L_name 作为福特,那么我的输出为
性别 | 姓名 | 电话 |
---|---|---|
男性 | 汤姆 | 123 |
女性 | 杰西卡 | 123123 |
男性 | 约翰 | 3412 |
其他 | 詹姆士 | 4321 |
男性 | 理查德 | 12123 |
其他 | 丽莎 | 22412 |
我需要帮助扩展脚本,方法是选择列表中的每个性别和值来执行其他功能,然后调用以下性别和值来实现相同的功能。 例如,首先,它选择性别男性 [Tom, John] 并执行其他功能。 然后选择下一个性别女性 [Jessica] 并执行相同的功能,然后选择性别 Other [James, Lisa] 并执行相同的功能。
我建议使用 pandas 模块,它可以轻松过滤和分组数据
import pandas as pd
if __name__ == '__main__':
data = pd.read_csv('name_reports.csv')
L_name = input("Enter the last name: ")
by_last_name = data[data['Last_name'] == L_name]
groups = by_last_name.groupby(['Gender'])
for group_name, group_data in groups:
print(group_name)
print(group_data)
将其分解为各个部分,第一部分是
data = pd.read_csv('name_reports.csv')
这会从 csv 中读取数据并将其放入数据框第二个我们有
by_last_name = data[data['Last_name'] == L_name]
这会将数据框过滤为仅具有 Last_name 等于 L_name 的结果接下来我们对数据进行分组。
groups = by_last_name.groupby(['Gender'])
这将按性别对过滤后的数据帧进行分组,然后我们对其进行迭代。 它返回一个包含组名和与该组关联的数据框的元组。
for group_name, group_data in groups:
print(group_name)
print(group_data)
此循环仅打印出数据以从中访问字段,您可以使用 iterrows 函数
for index,row in group_data.iterrows():
print(row['city']
print(row['Phone']
print(row['Name']
然后您可以将它们用于您想要的任何功能。 我建议阅读 pandas 的文档,因为根据您计划使用的功能,使用该库可能会有更好的方法。 这是图书馆的链接https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html
由于您不能使用 pandas 模块,因此仅使用 csv 模块的方法如下所示
import csv
def has_last_name(row,last_name):
return row['Last_name'] == last_name
def has_gender(row,current_gender):
return row['Gender'] == current_gender
if __name__ == '__main__':
data = None
genders = ['Male','Female','Other']
with open('name_reports.csv') as csvfile:
data = list(csv.DictReader(csvfile,delimiter=','))
L_name = input('Enter the Last name: ')
get_by_last_name = lambda row: has_last_name(row,L_name)
filtered_by_last_name = list(filter(get_by_last_name,data))
for gender in genders:
get_by_gender = lambda row: has_gender(row,gender)
filtered_by_gender = list(filter(get_by_gender,filtered_by_last_name))
print(filtered_by_gender)
重要的部分是过滤器内置功能。 这接受一个函数,该函数从列表中接受一个项目并返回一个布尔值。 filter 接受这个函数和一个可迭代对象,并返回一个为该函数返回 true 的项目生成器。 另一个重要部分是 csv.DictReader,它将您的 csv 文件作为字典返回,这使您可以通过键而不是索引来访问属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.