首页 > 解决方案 > 按分类列展开熊猫数据框

问题描述

我正在尝试通过在一个分类列中创建更多特定于某个值的列来扩展数据框。我的数据框如下所示:

样本数据

根据列的值cluster,我想创建一个新的数据框,应该是这样的:

var1_clus0 , var1_clus1, ... var3_clus2

我有一个巨大的数据集,所以我试图在嵌套的 for 循环中执行此操作,该循环适用于集群列的第一个值,所有其他值都具有 NaN。

下面是我的脚本:

data_trans = pd.DataFrame()

for i in np.arange(0, len(varlist),1):
    for j in np.arange(0,6,1):
        data_trans[str(varlist[i]) + str("_clus_") + str(j)] = data[(data.segment_hc_print == j)][varlist[i]]

该代码可以正常工作并根据需要生成列。但它只解析分类列的第一个值并将它们放在新数据框中的新列中。对于所有其他分类值,它会生成 NAN。我做错了什么,我应该如何解决这个问题?

样本输出

给定我给出的示例数据集,以下是所需的输出: 示例输出

标签: pythonpandasdataframeexpansion

解决方案


由于您有一个 2D 数据集并且 varX 和 clusX 可能有多个匹配项,您必须决定要对这些匹配项做什么?我假设你想把它们加起来。如果是这样,您正在查看具有标题行和单个数据行的数据框,或者只是索引为您的 varX_clusX 的系列。

以下代码将执行此操作:

# Setup
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'var1'      : np.random.randint(0, 1000000, 1000000),
    'var2'      : np.random.randint(0, 1000000, 1000000),
    'var3'      : np.random.randint(0, 1000000, 1000000),
    'cluster'   : np.random.randint(0, 100, 1000000) 
    })

# Processing

# Setup the cluster column for string formatting.
df['cluster'] = 'clus' + df['cluster'].apply(str)

# Un-pivot the cluster column (I'm sure there's a better term)
df = df.set_index('cluster').stack().reset_index()

# Group by the unique combination of cluster / var and sum the values.
# This will generate a column named 0 - which I changed to 'values' just for readability.
df = df.groupby(['cluster','level_1']).sum().reset_index().rename(columns = {0 : 'values'})

# Create the formatted header you're looking for
df['piv'] = df['level_1'] + '_' + df['cluster']

# Final pivot to get the values to align with the the new headers
df = df.pivot(columns = 'piv', values = 'values').sum()

在我的机器上计时——大约 1 秒记录一百万条记录。不知道你需要多快。

如果您不想添加所有值并且存在任意索引,则可以简化:

df['cluster'] = 'clus' + df['cluster'].apply(str)

df = df.set_index('cluster').stack().reset_index()

df['piv'] = df['level_1'] + '_' + df['cluster']

df = df.pivot(columns = 'piv', values = 0).fillna(0)

这将为您提供一个数据框,即初始数据集的长度 x 变量的数量和大量的零。


推荐阅读