Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将三列文本文件转换为矩阵_Python_Matrix_Scipy - Fatal编程技术网

Python 将三列文本文件转换为矩阵

Python 将三列文本文件转换为矩阵,python,matrix,scipy,Python,Matrix,Scipy,您好,我想转换一个以制表符分隔的文件,如下所示: Species Date Data 1 Dec 3 2 Jan 4 2 Dec 6 2 Dec 3 对于这样的矩阵(种类为行标题): 我猜解决方案的一部分是创建一个包含两个键的字典,并使用defaultdict将新值附加到一个键对。我想把它转换成制表符分隔的形式,但也要转换成一种格式,这样我就可以使用scipy的集群部分。库中的对象使这变得非常简单 import csv from

您好,我想转换一个以制表符分隔的文件,如下所示:

Species Date Data
1       Dec   3 
2       Jan   4
2       Dec   6
2       Dec   3
对于这样的矩阵(种类为行标题):

我猜解决方案的一部分是创建一个包含两个键的字典,并使用defaultdict将新值附加到一个键对。我想把它转换成制表符分隔的形式,但也要转换成一种格式,这样我就可以使用scipy的集群部分。

库中的对象使这变得非常简单

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
),因为这是panda的
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文档)。

库中的对象使此操作非常简单

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
),因为这是panda的
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文档)。

我不知道
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]

可爱,不是吗?

我不知道
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]

可爱,不是吗?

和熊猫在一起很简单。您可以使用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')

与熊猫的关系很简单。您可以使用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')
可能的重复可能的重复