我已经开发了一个函数来聚合文件中给出的每个给定群组的总人口。此功能目前使用两次。一旦得到总[实际]人口,一次得到'案例'的总数。 我遇到的问题是函数没有读到'case'文件的末尾。我实现了一个行计数器,它打印迭代的行数。填充文件计数器输出为933,案例文件计数器输出为911,这意味着它不读取底部22个案例。有没有人知道为什么会这样?
这是我定义的功能:
def newPopCount(filename, fileheader):
rowCount = 0 # Row counter
import csv
popholder = []
cohorts = []
print (len(fileheader))
for i in range(3, len(fileheader)):
cohorts.append(fileheader[i])
for i in range(len(cohorts)):
popholder.append(0)
popcsv = open(filename, 'r', newline = '')
popreader = csv.reader(popcsv, delimiter = ',')
for row in popreader:
rowCount += 1
counter = 0
if row[0] == fileheader[0]:
continue
else:
for i in range(3, len(fileheader)):
popholder[counter] += int(row[i])
counter += 1
popcsv.close()
print (rowCount) # Print row counter
return popholder
顺便说一句:fileheader
是从另一个函数获得的,就像它听起来的那样 - 文件的标题。此外,索引从3
开始,因为文件中的第一个条目是zipcode,x坐标和y坐标。
如果有人有任何想法请分享!
这是新的案例文件,这次使用逗号分隔数据。还有第二个文件,其中包含数据原始状态的示例。这个数据在主函数调用中聚合,生成我们实际谈论的文件:Cases
我还决定包含我用来获取标题的代码。我通常通过设置一个等于它的变量来调用它:thisHeader = getHeader('Cases.csv')
然后调用另一个函数caseRecord = newPopCount('Cases.csv', thisHeader)
以下是getHeader
功能:
`def getHeader(file):
import csv
headername = None
charList = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '+', '+', "'", '"', '{', '}', '[', ']', '?', '.', ',', '<', '>', '/', '~', '`', '-', '_']
headercsv = open(file, 'r', newline = '')
headerreader = csv.reader(headercsv, delimiter = ',')
for row in headerreader:
if row[0][0] in charList and row[1][0] in charList:
headername = row
headercsv.close()
return headername`
再次,谢谢你看看!
答案 0 :(得分:1)
我下载了您的要点并将其保存为cases.tsv
。
然后我在newPopCount
文件后修改了您的popcsv.readline()
以open
,并将下一行更改为使用delimiter='\t'
而不是delimiter=','
然后我用这一行运行它:
h = newPopCount('cases.tsv', ['zcta', 'xcoord', 'ycoord', 'm5064', 'm6574', 'm75plus', 'f5064', 'f6574', 'f75plus'])
打印出932。
由于有933行,其中一行是标题(未计算),这是正确答案。
所以,我最好猜测你只是在错误的文件上运行它,这就是你得错了答案的原因。
您的代码中存在错误并且不可能,并且您上传的错误示例数据恰好反击了该错误......但似乎不太可能。如果您可以向我们提供实际文件,以及实际在该文件上运行的代码以及调用newPopCount
函数的代码,那么排除这种可能性应该是微不足道的。
答案 1 :(得分:1)
这不是你问题的答案 - 所以我会把它变成CW - 但你可能会对查看pandas库感兴趣。这使得使用表格数据比其他方式更有趣。
首先阅读数据(我在这里使用你的NewCaseFile
,这似乎是用逗号分隔的,所以我称之为ncf.csv
):
>>> import pandas as pd
>>> df = pd.read_csv("ncf.csv")
>>> df
<class 'pandas.core.frame.DataFrame'>
Int64Index: 932 entries, 0 to 931
Data columns (total 9 columns):
zcta 932 non-null values
xcoord 932 non-null values
ycoord 932 non-null values
m5064 932 non-null values
m6574 932 non-null values
m75plus 932 non-null values
f5064 932 non-null values
f6574 932 non-null values
f75plus 932 non-null values
dtypes: float64(1), int64(8)
>>> df.head() # look at the start of the frame
zcta xcoord ycoord m5064 m6574 m75plus f5064 f6574 f75plus
0 51062 211253.4 4733175 0 0 1 0 0 0
1 51011 212255.6 4757939 0 0 1 0 0 0
2 51109 215303.5 4721048 0 1 7 0 1 2
3 51001 215651.1 4746655 1 0 4 0 1 0
4 51103 216887.7 4713568 4 9 28 1 1 8
使用x,y,zip列作为索引,并在总体列中求和:
>>> df = df.set_index(["zcta", "xcoord", "ycoord"])
>>> df["total"] = df.sum(axis=1)
>>> df.head()
m5064 m6574 m75plus f5064 f6574 f75plus total
zcta xcoord ycoord
51062 211253.4 4733175 0 0 1 0 0 0 1
51011 212255.6 4757939 0 0 1 0 0 0 1
51109 215303.5 4721048 0 1 7 0 1 2 11
51001 215651.1 4746655 1 0 4 0 1 0 6
51103 216887.7 4713568 4 9 28 1 1 8 51
按列汇总:
>>> df.sum()
m5064 981
m6574 1243
m75plus 2845
f5064 1355
f6574 1390
f75plus 1938
total 9752
dtype: int64
等等。特别是,它可以更容易地进行许多其他直接解释但又烦人的实践转换。例如:
>>> df = pd.read_csv("ncf.csv")
>>> d2 = pd.melt(df, id_vars=list(df.columns[:3]))
>>> d2["sex"] = d2["variable"].str[:1]
>>> d2["age_lower"] = d2["variable"].str[1:3].astype(float)
>>> d2["age_upper"] = d2["variable"].str[3:].replace("plus", 100).astype(float)
>>> del d2["variable"]
>>> d2.rename(columns={"value": "count"}, inplace=True)
给出:
>>> d2.head()
zcta xcoord ycoord count sex age_lower age_upper
0 51062 211253.4 4733175 0 m 50 64
1 51011 212255.6 4757939 0 m 50 64
2 51109 215303.5 4721048 0 m 50 64
3 51001 215651.1 4746655 1 m 50 64
4 51103 216887.7 4713568 4 m 50 64
>>> d2.groupby("sex")["count"].sum()
sex
f 4683
m 5069
Name: count, dtype: int64
等等。
答案 2 :(得分:0)
首先感谢大家考虑他的问题并试图帮助我。在回答@abarnert的问题时发现,我忘记在创建后关闭这个聚合文件(NewCaseFile.csv
)。因此,在添加.close()
语句后,一切都开始正常工作。谢谢大家,花时间看看我的问题。