Python 将pd.get\u假人结果转换为df.str.get\u假人

Python 将pd.get\u假人结果转换为df.str.get\u假人,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个很大的数据框,形状像 animal ids cat 1,3,4 dog 1,2,4 hamster 5 dolphin 3,5 它有大约60k行,ids列有超过100k的逗号分隔整数用于许多行,大多数都有超过10k的id。试图逃跑 u = df["ids"].str.get_dummies(",") 所以我可以计算jaccard索引,但由于数据大小的原因,它会因内存错误而崩溃,因为serie

我有一个很大的数据框,形状像

animal    ids
cat       1,3,4
dog       1,2,4
hamster   5        
dolphin   3,5
它有大约60k行,ids列有超过100k的逗号分隔整数用于许多行,大多数都有超过10k的id。试图逃跑

u = df["ids"].str.get_dummies(",")
所以我可以计算jaccard索引,但由于数据大小的原因,它会因内存错误而崩溃,因为series.str.get\u dummies()使用Int64作为数据类型,并且无法更改它,至少我不知道如何更改,因为str.get\u dummies()没有数据类型参数

所以我试着跑了

u = pd.get_dummies(df, columns=["ids"], dtype=np.uint8)
这是可行的,但它产生了完全不同的结果

例如,如果我们在上面的示例中运行
u=df[“ids”].str.get_dummies(“,”
),它将生成

   1  2  3  4  5
0  1  0  1  1  0
1  1  1  0  1  0
2  0  0  0  0  1
3  0  0  1  0  1
如果我们运行
u=pd.get_dummies(df,columns=[“ids”],dtype=np.uint8)
,它会给出

    animal  ids_1,2,4  ids_1,3,4  ids_3,5  ids_5
0      cat          0          1        0      0
1      dog          1          0        0      0
2  hamster          0          0        0      1
3  dolphin          0          0        1      0

有没有办法将df[“ids”].str.get_dummies(“,”的数据类型设置为uint8,或者使用pd.get_dummies(df,columns=[“ids”],dtype=np.uint8)可以得到类似的结果?对于大数据,使用返回稀疏矩阵的
sparse=True
可能是个好主意,然后我们可以使用:将其转换回数据帧

from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer(sparse_output=True)

output = pd.DataFrame.sparse.from_spmatrix(mlb.fit_transform(df['ids'].str.split(',')),
                                          columns=mlb.classes_)


实际上,我在一个小集合中运行了两个结果,它们产生了完全不同的结果。我将相应地更新问题。是的,pd.get_dummies可能没有根据上面的代码执行您希望它执行的操作。这不是对您的问题的直接回答,但有一些想法:1)不太可能,但很容易测试是否
df[“ids”]。str.get_dummies(sep=“,”)。astype(np.uint8)
有效2)如果每行只有几个元素,稀疏表示将显著提高内存效率(我不知道如何直接将其转换为稀疏表示)3)
dask通常可与pandas互操作,但允许内核外(从磁盘)操作,因此内存不是这样的约束4)您可以分块从csv读/写;这可能会有点乏味,但几乎可以肯定会起作用。我尝试过,它首先尝试使用64获取结果,然后进行转换,所以仍然会崩溃。您可以尝试从sklearn.preprocessing import MultiLabelBinarizer
mlb=MultiLabelBinarizer(sparse\u output=True)
然后
output=pd.DataFrame.sparse.from_spmatrix(mlb.fit_transform(df['ids'].str.split(',')))
这可能会起作用,因为它应该会保存RAM,因为它返回一个稀疏矩阵非常感谢,如果您不介意的话,还有一个问题。在这之后,我想使用scipy.spatial中的distance函数运行j=distance.pdist(输出,“jaccard”),但它也给出了内存错误,因为数据大小和数据类型仍然是int64。是否有机会至少设置一个数据类型?@AhmetCetin不确定,但可能是我们可以看看是否可以将稀疏矩阵直接转换为一个较小位的数组,并使用相同的数据帧。实际上,我使用
output=output.astype(np.uint8)
将结果设置为uint8
print(output)

   1  2  3  4  5
0  1  0  1  1  0
1  1  1  0  1  0
2  0  0  0  0  1
3  0  0  1  0  1