Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为更大的数据创建指标矩阵?_Python_Pandas_Numpy_Data Science - Fatal编程技术网

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