0

これを行うには何十もの「正しい」方法があるに違いないことは知っていますが、次のことを行うベストプラクティス/最もスマートな方法について意見を求めたいと思います.

次のような CSV があります。

Date,Num,name,Aging,Open Balance
07/16/2012,12-001270,8,1,"-8,934.75"
07/18/2012,12-2429,24,34,2.00
07/18/2012,12-2428,24,58,85.00
07/18/2012,12-2420,8,58,"4,381.90"

そして、次の形式のようにする必要があります。

name,num,date,0-30,31-60,61-90,91+,total
8,12-001270,7/16/2012,"-8,934.75",0,0,0,"-8,934.75"
8,12-2420,07/18/2012,0,"4,381.90",0,0,"4,381.90"
24,12-2428,07/18/2012,0,2,85,87

問題は、この方法でデータをバケット化できる Python のプラグ アンド プレイ ソリューションがあるかどうかです。

列データをAging取得し、さまざまな範囲に分割して、示されているようにデータを再フォーマットします。

これを行うための最も効率的な方法は何でしょうか?

4

1 に答える 1

3

開始するためのいくつかのビット...

ファイルの読み取りと値へのアクセス

with open('somefile.csv') as fin:
    csvin = csv.DictReader(fin)
    for row in csvin:
        print 'Person {name} had a balance of {Open Balance}'.format(**row)

使用できるように金額をフォーマットする

import re

s = "-8,934.75"
try:
    amount = float(re.sub('[^-.0-9]', '', s))
except ValueError as e:
    pass # wasn't valid for some reason? do something sensible

データの「バケット化」

from bisect import bisect

def age_band(age, upto=[30, 60, 90], desc=['0-30', '31-60', '61-90', '91+']):
    if not age >= 0:
        return '*invalid*'
    return desc[bisect(upto, age)]

for age in [31, 99, 65, 12, -1]:
    print age, age_band(age)
于 2012-09-19T08:54:08.683 に答える