熊猫:阅读csv和转动数据

时间:2018-04-22 01:35:01

标签: python python-3.x pandas csv dataframe

我正在尝试从一个文件创建一个pandas Data Frame,其格式类似于逗号分隔值,但没有标题行。在每一行上,该文件包含用户ID,电影ID和相应用户给出相应电影的评级。我想把它变成一个数据框,其中包含y轴的电影ID,x轴的用户ID,以及每个“单元格”中的值。我怎样才能做到这一点?到目前为止,我所看到的一切只允许我设置y轴,而不是直接从逗号分隔值读取到数据帧时设置x轴。

数据格式:(时间是最后一个,我可以将其删除,因为目的是计算用户之间的评分相似度

1   1   5   874965758  
1   2   3   876893171  
1   3   4   878542960  
1   4   3   876893119  
1   5   3   889751712  
1   7   4   875071561  
1   8   1   875072484  
1   9   5   878543541  
1   11  2   875072262  
1   13  5   875071805  

2 个答案:

答案 0 :(得分:1)

这是通过pandas.pivot_table

的一种方式
import pandas as pd, numpy as np
from io import StringIO

mystr = StringIO("""1   1   5   874965758  
1   2   3   876893171  
1   3   4   878542960  
1   4   3   876893119  
1   5   3   889751712  
1   7   4   875071561  
2   2   1   875072484  
2   3   5   878543541  
2   4  2   875072262  
2   5  5   875071805  """)

# read csv file, replace mystr with 'file.csv'
df = pd.read_csv(mystr, delim_whitespace=True, header=None,
                 usecols=[0, 1, 2], names=['user', 'movie', 'rating'])

# restructure dataframe via pivot_table
res = df.pivot_table(index='movie', columns='user', values='rating',
                     fill_value=0, aggfunc=np.mean)

print(res)

# user   1  2
# movie      
# 1      5  0
# 2      3  1
# 3      4  5
# 4      3  2
# 5      3  5
# 7      4  0

答案 1 :(得分:0)

另一种选择是使用多级索引(使用set_index或在read_csv期间),然后使用unstack

df = pd.read_csv('ratings.csv') # Assumes there are column headers.
df.set_index(keys=['movieID','userID']).unstack()

The resulting dataframe