嗨,即时通讯新手在一个麻烦的地方我正在从互联网上读取文件并通过拆分新行然后在逗号上清理它,输出是数千行,看起来像这样: / p>
[59, 'Self-emp-inc', 'none', 'none', 10, 'Married-civ-spouse',
'Craft-repair', 'Husband', 'White', 'Male', 0, 0, 50, 'none', '>50K']
我想要做的是循环计算每个属性的行数,并且取决于最后一个元素是>50K
还是<=50K
我想将它放在age_over_dict或age_under_dict中,所以在对于每个属性age_over_dict{59:79,Self-emp-inc:56}
,我应该拥有这样的结果,因此对于59岁并且获得&gt; 50K的人来说是79,依此类推。我似乎无法让这部分工作任何帮助将非常感谢提前感谢。这是我目前的代码
def trainClassifier(f):
age_over = {}
age_under = {}
count = 0
count_over = 0
count_under = 0
for row in f:
row = row.split(", ")
count +=1
if row[-1]in f == " >50K":
if row[0] in f == age_over:
age_over +=1
count_over+=1
else:
age_over = age_over + 1
count_over+=1
print(age_over,count_over,count)
return age_over
答案 0 :(得分:0)
这应该按照你的要求行事:
def trainClassifier(f):
count = 0
count_over = 0
count_under = 0
age_over = {}
age_under = {}
for line in f:
row = [ x.strip() for x in line.split(",") ]
print row
count +=1
if int(row[0]) > 50:
dest_dict = age_over
else:
dest_dict = age_under
for attr in row:
if attr not in dest_dict:
dest_dict[attr] = 1
else:
dest_dict[attr] += 1
return age_over,age_under
但是,请注意,对于csv中的每条记录,重复的属性将被计数多次。不确定这是你想要的行为。
答案 1 :(得分:0)
来自Counter
的{{1}}会从迭代中创建直方图。
collections
首先,您需要过滤您想要依赖的信息。在你的情况下,年龄,第一个元素和收入,最后一个元素。我在列表理解中获取这些元素,并将结果传递给Counter,以获取每个年龄,收入对的计数。
from collections import Counter
以下是一个例子,列出了[年龄,无意义,收入]的列表:
Counter([(i[0],i[-1]) for i in f])
过滤我们需要的数据的中间步骤:
>>> a
[[30, 1, '>50'], [59, 2, '<50'], [30, 3, '>50']]
和构建计数器的结果:
>>> b = [(i[0], i[-1]) for i in a]
>>> b
[(30, '>50'), (59, '<50'), (30, '>50')]
从这里开始,如果您想知道30岁以上且人数超过50k的人数,您可以像字典一样使用>>> c = Counter(b)
>>> c
Counter({(30, '>50'): 2, (59, '<50'): 1})
:
c