我正在尝试为“性别”列中的每个不同值从“名称”列中获取唯一值。
以下是示例数据: sample input_file_data:
index,name,gender,alive
1,Adam,Male,Y
2,Bella,Female,N
3,Marc,Male,Y
1,Adam,Male,N
当我给出与“性别”相对应的值时,我可以得到它,例如,在下面的代码中给出“男性”:
filtered_data = filter(lambda person: person["gender"] == "Male", input_file_data)
reader = (dict((k, v.strip()) for k, v in row.items() if v) for row in filtered_data)
countt = [rec[gender] for rec in reader]
final1 = input_file_name + ".txt", "gender", "Male"
output1 = str(final1).replace("(", "").replace(")", "").replace("'","").replace(", [{", " -- [").replace("}", "")
final2 = set(re.findall(r"name': '(.*?)'", str(filtered_data)))
final_count = len(final2)
output = str(final_count) + " occurrences", str(final2)
output2 = output1, str(output)
output_final = str(output2).replace('\\', "").replace('"',"").replace(']"', "]").replace("set", "").replace("(", "").replace(")", "").replace("'","").replace(", [{", " -- [").replace("}", "")
output_final = output_final + "\n"
当前输出:
input_file_name.txt, gender, Male, 2 occurrences, [Adam,Marc]
预期产出:
input_file_name.txt, gender, Male, 2 occurrences, [Adam,Marc], Female, 1 occurrences [Bella]
应显示所有唯一出现的名称,用于每个不同的性别值(无需硬编码)。我也不想使用熊猫。任何帮助都非常感谢。
PS-我有多个文件,并非所有文件都有相同的列。所以我不能硬编码。此外,所有文件都有“名称”列,但并非所有文件都有“性别”列。此脚本应适用于任何其他列,如“索引”或“活着”或其他任何内容,而不仅仅是性别。
答案 0 :(得分:3)
我会使用csv
模块以及defaultdict
中的collections
来实现此目的。假设它存储在名为test.csv的文件中:
>>> import csv
>>> from collections import defaultdict
>>> with open('test.csv', 'rb') as fin: data = list(csv.reader(fin))[1:]
>>> gender_dict = defaultdict(set)
>>> for idx, name, gender, alive in data:
gender_dict[gender].add(name)
>>> gender_dict
defaultdict(<type 'set'>, {'Male': ['Adam', 'Marc'], 'Female': ['Bella']})
你现在有一本字典。每个键都是性别列中的唯一值。每个值都是一个集合,因此您只能获得唯一的项目。请注意,我们添加了'Adam'
两次,但只在结果集中看到一个。
您不需要defaultdict
,但它允许您使用较少的样板代码来检查密钥是否存在。
编辑:可能有助于更好地了解数据本身。鉴于您的代码,我可以做出以下假设:
input_file_data
是一个包含字典的可迭代(列表,元组,类似的东西)。
每个字典都包含一个'gender'
键。如果它不包含至少'gender'
,则在尝试过滤时会出现关键错误。
每个词典都有一个'name'
键,看起来像。
而不是做所有的正则表达式,这是怎么回事?
>>> gender_dict = {'Male': set(), 'Female': set()}
>>> for item in input_file_data:
gender_dict[item['gender']].add(item['name'])
如果不是每个条目都有名称,您可以使用item.get('name')
代替item['name']
。
编辑#2:好的,您需要做的第一件事就是让您的数据进入一致状态。我们绝对可以得到一个列名称(性别,索引,活着,无论你想要什么)和一组与这些列对应的唯一名称。像这样:
data_dict = {'gender':
{'Male': ['Adam', 'Marc'],
'Female': ['Bella']}
'alive':
{'Y': ['Adam', 'Marc'],
'N': ['Bella', 'Adam']}
'index':
{1: ['Adam'],
2: ['Bella'],
3: ['Marc']}
}
如果那是你想要的,你可以试试这个:
>>> data_dict = defaultdict(lambda: defaultdict(lambda: defaultdict(set)))
>>> for element in input_file_data:
for key, value in element.items():
if key != 'name':
data_dict[key][value].add(element[name])
应该为你提供你想要的东西,我想?我无法测试,因为我没有您的数据,但请尝试一下。