事务到numpy数组的转换

2024-03-28 14:25:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下格式的每日事务数据列表:

人员,项目代码,转换日期,金额

我想按person和itemCode对amount列求和,并将结果转换为numpy数组。我要删除日期字段。我有1.5gb的数据,所以我能做的越有效越好。。。你知道吗

下面是一个小例子,说明我希望算法如何运行:

 print input
 A, 1, 2013-10-10, .5
 A, 1, 2013-10-18, .75
 A, 2, 2013-10-20, 2.5
 B, 1, 2013-10-09, .25
 B, 2, 2014-10-20, .8

 myArray = transform(input)
 print myArray
 [[1.25,2.5],[.25,.8]]

任何关于如何有效地汇总这些记录的想法都将不胜感激!你知道吗

编辑:以下是我目前的代码:

from collections import defaultdict

dictObj = {}

rawData = 'subset.txt'

with open(rawData) as infile:
for line in infile:
    parts = line.split(',')
    key = (parts[0],parts[1])
    val = float(parts[3])
    if key in dictObj:
        dictObj[key] += val
    else:
        dictObj[key] = val
 print dictObj

Tags: 数据key代码ininput格式lineval
1条回答
网友
1楼 · 发布于 2024-03-28 14:25:18

正如@DSM所说,这个操作看起来像是^{}的作业:

>>> from StringIO import StringIO
>>> import pandas as pd
>>> data = '''A, 1, 2013-10-10, .5
... A, 1, 2013-10-18, .75
... A, 2, 2013-10-20, 2.5
... B, 1, 2013-10-09, .25
... B, 2, 2014-10-20, .8'''
... 
>>> df = pd.read_csv(StringIO(data), names=['person','itemCode','transDate','amount'], skiprows=0)
>>> df
  person  itemCode    transDate  amount
0      A         1   2013-10-10    0.50
1      A         1   2013-10-18    0.75
2      A         2   2013-10-20    2.50
3      B         1   2013-10-09    0.25
4      B         2   2014-10-20    0.80
>>> grouped = df.groupby(['person'])
>>> res = df.groupby(['person']).apply(lambda x: pd.Series(x.groupby('itemCode').sum()['amount']))
>>> res
itemCode     1    2
person             
A         1.25  2.5
B         0.25  0.8

结果是^{},但如果要将其作为numpy数组获取,可以使用^{}属性:

>>> res.values
array([[ 1.25,  2.5 ],
       [ 0.25,  0.8 ]])

相关问题 更多 >