从dataframe对象创建二维数组

2024-05-23 18:31:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe对象,如下所示:

'Name' 'Book' 'Rating'

'John' 'Moby Dick' 5

'John' 'The Alchemist' 3

'John' 'The Da Vinci Code' 4

'Peter' 'Moby Dick' 4

'Peter' 'Lolita' 5

'Mike' 'The Alchemist' 4

'Mike' 'The Da Vinci Code' 3

我想从这个数据中创建一个二维数组,大小为[len('Name')][len('Book')],数组的值应该是额定值。如果一个人没有给一本书评级,价值应该是零

5 3 0 4

4 0 5 0

0 4 0 3

在这里,我的第一行对应约翰,下一行对应彼得,最后一行对应迈克,第一列对应白鲸,第二列对应炼金术士,第三列对应洛丽塔,第四列对应达芬奇密码

我尝试了以下方法,扫描整个对象(我相信是两次,以获得每列的匹配)

import pandas
import numpy

df = read_from_file

uName = df['Name'].unique().tolist()
uBook = df['Book'].unique().tolist()
m = numpy.zeros((len(uName), len(uBook)))

for i in range(0, len(uName)):
    for j in range(0, len(uBook)):
        x = df.loc[(df['Name'] == uName[i]) & (df['Book'] == uBook[j])]
        if x.empty:
            m[i][j] = 0
        else:
            m[i][j] = x.Rating

它给了我正确的结果,但它是非常低效的。我的数据帧是巨大的-~50000行,运行这段代码需要很长时间。你能帮我找到一个更有效的方法吗?谢谢


Tags: the对象namedflenjohndaalchemist
2条回答

数据(temp.csv):

Name,Book,Rating
John,Moby Dick, 5
John,The Alchemist, 3
John,The Da Vinci Code, 4
Peter,Moby Dick, 4
Peter,Lolita, 5
Mike,The Alchemist, 4
Mike,The Da Vinci Code, 3

代码:

df = pd.read_csv('temp.csv')
print(df)
print(df.pivot(values='Rating', columns='Book', index='Name').fillna(0))

输出

Book   Lolita  Moby Dick  The Alchemist  The Da Vinci Code
Name                                                      
John      0.0        5.0            3.0                4.0
Mike      0.0        0.0            4.0                3.0
Peter     5.0        4.0            0.0                0.0
>>> import pandas as pd
>>> data = pd.DataFrame({'x': ['A', 'A', 'B','B', 'C'], 'y':['q','p','q', 'p', 'q'], 'r': [1, 2, 3, 4, 5]})
>>> data.pivot(values='r', columns='Name', index='Book')
x    A    B    C
y               
p  2.0  4.0  NaN
q  1.0  3.0  5.0

或者

>>> data.pivot(values='r', columns='x', index='y').fillna(0).values
array([[2., 4., 0.],
       [1., 3., 5.]])

对于您的数据帧,代码应该是这样的:

data.pivot(values='Rating', columns='x', index='y').fillna(0).values

相关问题 更多 >