python - 按分类列展开熊猫数据框
问题描述
我正在尝试通过在一个分类列中创建更多特定于某个值的列来扩展数据框。我的数据框如下所示:
根据列的值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。我做错了什么,我应该如何解决这个问题?
给定我给出的示例数据集,以下是所需的输出: 示例输出
解决方案
由于您有一个 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 变量的数量和大量的零。
推荐阅读
- geolocation - navigator.geolocation.watchPosition - Opera 浏览器
- wpf - 在匹配指定绑定约束的 Cefsharp.Wpf.ChromiumWebBrowser 上调用构造函数引发异常
- java - JPanel 循环绘制图表。Swing gui 需要帮助
- gatling - 通过顺序 http 请求在 Gatling 中实现用户行为
- android - 当我们在 androidStudio 中添加一个新的 kotlin 类/文件以及主要活动时,我们会得到与 kotlin 类/文件相关的 xml 文件。但
- linux - 无法访问文件
- python - 如何使带有变量的 Django url 模板找到正确的 url
- android - 如何从 arrayadapter 中获取值以将其传递给另一个活动
- java - 如何匹配字符串中任何位置的非单词字符?
- asp.net-core - 身份核心,持久登录不是持久的