我刚刚开始使用scipy / pandas,这可能绝对容易,但我迷失在这里。
我有一个包含3列的CSV文件:用户艺术家评分
现在我想要一个2D矩阵,其中行是用户,列是艺术家,评级是内容。
我尝试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.unstack()
输出是一个带有NaNs的2D矩阵,那里没有数据,就像我想要的那样!
但是,我仍然无法索引,因为data.index
是Index([u'amy', u'ben', u'clara', u'daisy'], dtype='object')
所以我只能再次向一个方向索引。
如何实现这个2D矩阵?
谢谢。
EDIT1:
如果结果是以后我取消堆叠:
>>> 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]
EDIT2: 预期产出
>>> data2.ix[:,1]
user
amy 3.0
ben 2.0
clara 3.5
daisy NaN
Name: (rating, psy), dtype: float64
但我想用'psy'代替1。
Edit3: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
答案 0 :(得分: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