python - Pandas 将非数字分类虚拟列转换为单个分类列
问题描述
我有如下数据
test=pd.DataFrame( {'group':['v','w','x','y','z'],
'cat1':['a',np.nan,np.nan,'c',np.nan],
'cat2':[np.nan,'b','a',np.nan,np.nan],
'cat3':[np.nan,np.nan,np.nan,np.nan,'a'],
})
我想做如下
| group | cat1 | cat2 | cat3 |
|-------|------|------|------|
| v | a | NaN | NaN |
| w | NaN | b | NaN |
| x | NaN | a | NaN |
| y | c | NaN | NaN |
| z | NaN | NaN | a |
至
| group | category | values |
|-------|----------|--------|
| v | cat1 | a |
| w | cat2 | b |
| x | cat2 | a |
| y | cat1 | c |
| z | cat3 | a |
我尝试idxmax
在stackoverflow中使用另一个问题,但这并没有奏效。
解决方案
您可以set_index
将“组”转换为索引,然后stack
删除 NaN,然后您就完成了:
test.set_index('group').stack()
group
v cat1 a
w cat2 b
x cat2 a
y cat1 c
z cat3 a
dtype: object
(test.set_index('group')
.stack()
.reset_index(name='values')
.rename(columns={'level_1': 'categories'}))
group categories values
0 v cat1 a
1 w cat2 b
2 x cat2 a
3 y cat1 c
4 z cat3 a
注意:不对行进行排序
另一种选择是使用pd.wide_to_long
,产生类似的输出:
(pd.wide_to_long(test, ['cat'], i=['group'], j='category')
.dropna()
.reset_index()
.rename(columns={'cat': 'values'}))
group category values
0 v 1 a
1 y 1 c
2 w 2 b
3 x 2 a
4 z 3 a
注意:行将按“类别”排序
推荐阅读
- typescript - TSLint 将 body-parser 标记为已弃用
- android - Retrofit Post 请求不起作用,我收到 500 错误代码(内部服务器错误)
- regex - 删除vim中每一行的第i个字符?
- python - 为什么我没有收到来自 AWS iot 核心的 on_message 回调
- vba - 在循环中创建 ContentControls (RichText)
- python - 根据列组合在数据框中创建唯一标识符
- java - 使用 Apache POI 将整列格式化为数字
- mysql - 从具有相同 ID 的 2 个表中选择所有行
- wpf - 无法滚动包含 Expander 和 ItemControl WPF 的 ListView
- javascript - 内联块元素成为我的代码的块级元素,我该如何修复它?