Pandas:将CSV加载为二维矩阵

2 投票
1 回答
2693 浏览
提问于 2025-04-20 19:50

我刚开始接触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.indexIndex([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

撰写回答