Python 为更大的数据创建指标矩阵?
我有以下资料:Python 为更大的数据创建指标矩阵?,python,pandas,numpy,data-science,Python,Pandas,Numpy,Data Science,我有以下资料: movies.head() 并希望根据其类型创建一个分类矩阵。 最终结果应如下所示: 我知道如何用一种缓慢的方式来做,即: all_genres = [] for x in movies.genres: all_genres.extend(x.split('|')) genres = pd.unique(all_genres) genres 输出为: array(['Animation', "Children's", 'Comedy', 'Ad
movies.head()
并希望根据其类型创建一个分类矩阵。
最终结果应如下所示:
我知道如何用一种缓慢的方式来做,即:
all_genres = []
for x in movies.genres:
all_genres.extend(x.split('|'))
genres = pd.unique(all_genres)
genres
输出为:
array(['Animation', "Children's", 'Comedy', 'Adventure', 'Fantasy',
'Romance', 'Drama', 'Action', 'Crime', 'Thriller', 'Horror',
'Sci-Fi', 'Documentary', 'War', 'Musical', 'Mystery', 'Film-Noir',
'Western'], dtype=object)
创建零矩阵并将其列重命名为类型:
zero_matrix = np.zeros((len(movies), len(genres)))
dummies = pd.DataFrame(zero_matrix, columns=genres)
dummies.head()
输出为:
将电影.流派
转换为分类矩阵:
for i, gen in enumerate(movies.genres):
indices = dummies.columns.get_indexer(gen.split('|'))
dummies.iloc[i, indices] = 1
movies_windic = movies.join(dummies.add_prefix('Genre'))
movies_windic.iloc[0:2]
输出为:
array(['Animation', "Children's", 'Comedy', 'Adventure', 'Fantasy',
'Romance', 'Drama', 'Action', 'Crime', 'Thriller', 'Horror',
'Sci-Fi', 'Documentary', 'War', 'Musical', 'Mystery', 'Film-Noir',
'Western'], dtype=object)
以上代码摘自《Python for Data Analysis第二版》第213页和第214页
让我恼火的是代码中关于其性能的警告,这是
对于更大的数据,这种构造指标变量的方法
拥有多个会员的情况下,速度不是特别快。是的
最好编写直接写入NumPy的低级函数
数组,然后将结果包装在数据帧中
有没有人能给我一个指针,告诉我如何使用较低级别的函数来实现它,这样它就能更快地工作?
提前感谢您。让我们生成一些随机数据:
将熊猫作为pd导入
df=pd.DataFrame({“电影编号”:[1,2,3,4,5],“类型”:[“A | B | C”,“B | C”,“A | C”])
打印(df)
我想出了一个可怕的解决办法:
newdf=pd.concat([df,pd.get_dummies(df['genres'].str.split('124;').explode(),prefix=“genre”)],axis=1)。groupby([“Movie_number”,“genres”])。sum()。reset_index()
打印(newdf)
说明:
首先,我们根据|
分隔符分解“流派”
列:
df['genres'].str.split('|').explode()
0 A
0 B
0摄氏度
1b
2 B
2 C
3 C
4A
4 C
名称:流派,数据类型:对象
然后,我们使用pd.get_dummies
将其转换为指标变量:
>>pd.get_dummies(df['genres'].str.split(“|”).explode(),prefix=“genre”)
体裁A体裁B体裁C
0 1 0 0
0 0 1 0
0 0 0 1
1 0 1 0
2 0 1 0
2 0 0 1
3 0 0 1
4 1 0 0
4 0 0 1
在这之后,我们将其与原始数据帧连接起来,最后我们将行与groupby
和sum
合并
>>pd.concat([df,pd.get_dummies(df['genres'].str.split('124;').explode(),prefix=“genre”)],axis=1)。groupby([“Movie_number”,“genres”])。sum()。reset_index()
电影类型数量类型A类型B类型C
0 1 A | B | C 1 1 1
12B010
2 3 B | C 0 1 1
34C001
4 5 A | C 10 1
尽管它不是很低级,但我认为它肯定比for loop快。您提到过,您知道如何以慢节奏完成for loop。Im就整体性能而言,是不是专门针对循环来获得所有有问题的独特类型?如果是这样,我建议使用set(),并将其添加,因为它不存储重复的项,因此不会像列表那样变得非常长。这应该会加快它的速度,尽管我不清楚有多快(使用.extend()而不是.append()做得很好)。基于groupby语句并结合reset_index()来创建新的数据帧,比如
cat_df=df.groupby('category').count().reset_index()
?
Movie_number genres genre_A genre_B genre_C
0 1 A|B|C 1 1 1
1 2 B 0 1 0
2 3 B|C 0 1 1
3 4 C 0 0 1
4 5 A|C 1 0 1