您好我想转换一个以制表符分隔的文件,如下所示:
Species Date Data
1 Dec 3
2 Jan 4
2 Dec 6
2 Dec 3
到这样的矩阵(种类是行标题):
1 2
Dec 3 9
Jan 4
我猜测解决方案的一部分是创建一个包含两个键的字典,并使用defaultdict将新值附加到密钥对。我想将它吐出为制表符分隔的形式,但也可以使用格式,以便我可以使用scipy的集群部分。
答案 0 :(得分:2)
import csv
from collections import defaultdict
from pandas import DataFrame
rdr = csv.reader(open('mat.txt'), delimiter=' ', skipinitialspace=True)
datacols = defaultdict(list)
# skip header
rdr.next()
for spec, dat, num in rdr:
datacols['species'].append(int(spec))
datacols['dates'].append(dat)
datacols['data'].append(int(num))
df = DataFrame(datacols)
df2 = df.pivot(index='dates', columns='species', values='data')
首先,我们以您提供的格式从文件中读取数据。然后构建一个列字典(datacol
),因为这是熊猫的DataFrame
想要的。构建DataFrame
后(df
),然后调用它的pivot方法以获得所需的格式。以下是控制台中df
和df2
的样子:
In [205]: df
Out[205]:
data dates species
0 3 Dec 1
1 4 Jan 2
2 6 Dec 2
3 3 Dec 2
In [206]: df2
Out[206]:
1 2
Dec 3 3
Jan NaN 4
然后,您可以使用toCSV
方法将其保存到文件中(请参阅之前链接的DataFrame文档)。
答案 1 :(得分:1)
我不知道numpy
,所以我只能提供部分帮助,但我发现这个小小的片段很有趣,所以这里有defaultdict:
# we'll pretend *f* is a file below
f = '''Species Date Data
1 Dec 3
2 Jan 4
2 Dec 6
2 Dec 3'''.split('\n')[1:]
from collections import defaultdict
d = defaultdict(int)
for ln in f:
x,y,n = ln.split()
d[x,y] += int(n)
# transpose the list of tuples (keys) to get the two dimensions, remove the duplicates
x,y = map(set, zip(*d))
print list(x)
for yy in y:
print yy, [d[xx,yy] for xx in x]
并且运行它的结果是
['1', '2']
Jan [0, 4]
Dec [3, 9]
可爱,不是吗?
答案 2 :(得分:1)
大熊猫很简单。您可以使用read_table()读取文本文件,但我手动创建了下面的数据框。
from pandas import DataFrame
#create the data frame
df = DataFrame({'Species' : [1,2,2,2],
'Date' : ['Dec','Jan', 'Dec', 'Dec'],
'Data' : [3,4,6,3]} )
#group by the Date and Species columns, and take the sume of the Data column
df2 = df.groupby(['Date','Species'])['Data'].sum()
# unstack the Species Column to reshape your data
df2.unstack('Species')