我试图将具有分类特征的数据框直接透视到稀疏矩阵中。我的问题类似于this question或this one,但我的数据框包含多个分类变量,因此这些方法不起作用。
这段代码目前可以工作,但是df.pivot()
可以处理密集矩阵,而我的真实的数据集用完了RAM。你能建议一种从一开始就处理稀疏矩阵的方法吗?
import pandas as pd
from scipy.sparse import csr_matrix
from sklearn.preprocessing import OneHotEncoder
# Example dataframe
data = {
'id':[13,13,14,14,14,15],
'name':['alex', 'mary', 'alex', 'barry', 'john', 'john'],
'categ': ['dog', 'cat', 'dog', 'ant', 'fox', 'seal'],
'size': ['big', 'small', 'big', 'tiny', 'medium', 'big']
}
df = pd.DataFrame(data)
# Pivoting -- problematic step creating a huge dense matrix
pivot = df.pivot(index='id', columns='name', values=['categ','size']).fillna('-')
cols = pivot.columns.to_flat_index().str.join('_')
pivot.columns = cols
# One hot encoding into a sparse matrix
encoder = OneHotEncoder(sparse_output=True)
pivot_enc = encoder.fit_transform(pivot)
pivot = pd.DataFrame.sparse.from_spmatrix(
pivot_enc, columns=encoder.get_feature_names_out())
print(pivot.dtypes)
谢谢帮忙!
1条答案
按热度按时间r1wp621o1#
技巧在于使用groupby(),它可以直接处理
Sparse
类型,但前提是首先使用.cat.codes
对分类变量进行编码。下面是使用稀疏矩阵的答案:
我仍在试图弄清楚如何修复列名,以保持基于this post的原始类别标签。