-1

ファイルで指定されたコホートごとに、総人口を集計する関数を開発しました。この関数は現在 2 回使用されています。[実際の] 人口の合計を取得するために 1 回、「ケース」の総数を取得するために 1 回。関数が「cases」ファイルの最後まで読み取れないという問題が発生しています。反復された行数を出力する行カウンターを実装しました。ポピュレーション ファイル カウンターの出力は 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また、ファイルの最初のエントリは郵便番号、x 座標、y 座標であるため、インデックス作成は から開始されます。

誰かが何か考えを持っているなら、共有してください!

これは新しいケース ファイルで、今回は適切にカンマでデータが区切られています。データの元の状態の例を含む 2 番目のファイルもあります。このデータは、実際に話しているファイルを生成する main 関数呼び出しで集計されます

また、ヘッダーを取得するために使用するコードを含めることにしました。私は通常、それに等しい変数を設定して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`

改めまして、ご覧いただきありがとうございます!

4

3 に答える 3

1

私はあなたの要旨をダウンロードし、cases.tsv.

次に、ファイルを ingnewPopCountしたpopcsv.readline()直後に実行するように yourを変更し、代わりに次の行を使用するように変更しました。opendelimiter='\t'delimiter=','

次に、次の行で実行しました。

h = newPopCount('cases.tsv', ['zcta', 'xcoord', 'ycoord', 'm5064', 'm6574', 'm75plus', 'f5064', 'f6574', 'f75plus'])

932が出力されました。

933 行あり、そのうちの 1 つがヘッダー (カウントされていない) であるため、これが正しい答えです。

したがって、間違ったファイルで実行しただけで、間違った答えが得られたのだと思います。

コードにバグがある可能性はありますが、アップロードした間違ったサンプル データがたまたまそのバグに完全に対応している可能性はありますが、その可能性は非常に低いと思われます。実際のファイル、そのファイルで実際に実行されるコード、および関数を呼び出すコードを提供できれば、newPopCountその可能性を除外するのは簡単です。

于 2013-04-05T01:01:39.357 に答える
1

これはあなたの質問に対する答えではないので、CW にしますが、pandasライブラリに興味があるかもしれません。それ以外の場合よりも、表形式のデータの操作がはるかに楽しくなります。

最初にデータを読み込みます (私はあなたのNewCaseFilehere を使用していますが、これはカンマで区切られているように見えるので、私はそれを呼び出しました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

等々。

于 2013-04-05T15:14:36.490 に答える
0

まず、彼の問題を考慮し、私を助けようとしてくれたことに感謝します。@abarnert の質問に答えているときに、この集約ファイル ( NewCaseFile.csv) を作成後に閉じるのを忘れていたことがわかりました。したがって、.close()ステートメントを追加した後、すべてが正常に機能し始めました。皆さん、私の問題を見てくれてありがとう。

于 2013-04-05T15:30:44.723 に答える