pandas 将多分类变量 Dataframe 透视成稀疏矩阵

qlvxas9a  于 2023-04-19  发布在  其他
关注(0)|答案(1)|浏览(112)

我试图将具有分类特征的数据框直接透视到稀疏矩阵中。我的问题类似于this questionthis 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)

谢谢帮忙!

r1wp621o

r1wp621o1#

技巧在于使用groupby(),它可以直接处理Sparse类型,但前提是首先使用.cat.codes对分类变量进行编码。
下面是使用稀疏矩阵的答案:

for col in ['categ', 'size']:
    df[col] = df[col].astype('category').cat.codes

# Group by into sparse columns
piv = df.groupby(['id', 'name'])[['categ', 'size']].first().astype('Sparse')

# Unstack keeps sparse format
piv = piv.unstack(fill_value='-')

piv.columns = piv.columns.to_flat_index().str.join('_')

# Encoding works as previously
encoder = OneHotEncoder(sparse_output=True)
piv_enc = encoder.fit_transform(piv)
piv_fin = pd.DataFrame.sparse.from_spmatrix(
    piv_enc, columns=encoder.get_feature_names_out())

我仍在试图弄清楚如何修复列名,以保持基于this post的原始类别标签。

相关问题