Pandas:将CSV加载为二维矩阵
我刚开始接触scipy和pandas,可能这对其他人来说很简单,但我现在有点迷茫。
我有一个CSV文件,里面有三列:用户、艺术家和评分。
现在我想把这些数据整理成一个二维矩阵,行是用户,列是艺术家,内容是评分。
我试过用 pandas.read_csv(file, index_col = [0,1])
来读取文件,但这样我得到的结果是:
rating
user artist
amy swift 4.0
psy 3.0
houston 4.0
ben swift 5.0
psy 2.0
clara psy 3.5
houston 4.0
daisy swift 5.0
houston 3.0
但是现在我无法像这样索引行和列:data[:,:]。如果我使用 data.unstack()
,输出会是一个二维矩阵,里面有NaN(表示没有数据的地方),这正是我想要的!但是,我仍然无法索引,因为 data.index
是 Index([u'amy', u'ben', u'clara', u'daisy'], dtype='object')
,所以我只能在一个方向上索引。
我该如何得到这个二维矩阵呢?
谢谢。
编辑1:
如果我进行一次unstack,结果是:
>>> data2.ix[:,:]
rating
artist houston psy swift
user
amy 4 3.0 4
ben NaN 2.0 5
clara 4 3.5 NaN
daisy 3 NaN 5
然后我想像这样索引Psy这一列: data2.ix[:,'psy']
,但我得到 KeyError: 'psy'
的错误。不过 data2.ix[:,:]
是可以工作的。
>>> data2.ix[:,['psy']]
Empty DataFrame
Columns: []
Index: [amy, ben, clara, daisy]
编辑2:
期望的输出是:
>>> data2.ix[:,1]
user
amy 3.0
ben 2.0
clara 3.5
daisy NaN
Name: (rating, psy), dtype: float64
但我想用'psy'来代替1。
编辑3:csv文件内容是:
amy swift 4
amy psy 3
amy houston 4
ben swift 5
ben psy 2
clara psy 3.5
clara houston 4
daisy swift 5
daisy houston 3
1 个回答
0
一旦你进行了“解堆”,数据框就会多出一个层级,用来表示rating
(评分)。这样看起来就能按照你想要的方式工作了:
import pandas
raw = {'rating': {('amy', 'houston'): 4.0,
('amy', 'psy'): 3.0,
('amy', 'swift'): 4.0,
('ben', 'psy'): 2.0,
('ben', 'swift'): 5.0,
('clara', 'houston'): 4.0,
('clara', 'psy'): 3.5,
('daisy', 'houston'): 3.0,
('daisy', 'swift'): 5.0}}
data = pandas.DataFrame(raw)
data2 = data.unstack()
data2.rating.ix[:, 'psy']
=>
amy 3.0
ben 2.0
clara 3.5
daisy NaN
Name: psy, dtype: float64