繁体   English   中英

如何使用python过滤和排序特定的csv

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM