python - Pandas DataFrame:如何将数字列转换为成对分类数据?
问题描述
给定一个 pandas 数据帧,如何将几个数字列(其中 x≠1 表示值存在,x=0 表示不存在)转换为成对的分类数据帧?我知道它类似于 one-hot 解码,但列并不完全是 one-hot。
一个例子:
df
id A B C D
0 3 0 0 1
1 4 1 0 0
2 1 7 20 0
3 0 0 0 4
4 0 0 0 0
5 0 1 0 0
结果将是:df id match
result
0 A
0 D
1 A
1 B
2 A
2 B
2 C
3 D
5 B
解决方案
DataFrame.stack
与过滤和 一起使用Index.to_frame
:
s = df.stack()
df = s[s!=0].index.to_frame(index=False).rename(columns={1:'result'})
print (df)
id result
0 0 A
1 0 D
2 1 A
3 1 B
4 2 A
5 2 B
6 2 C
7 3 D
8 5 B
或者,如果性能对使用构造函数numpy.where
匹配值的索引很重要DataFrame
:
i, c = np.where(df != 0)
df = pd.DataFrame({'id':df.index.values[i],
'result':df.columns.values[c]})
print (df)
id result
0 0 A
1 0 D
2 1 A
3 1 B
4 2 A
5 2 B
6 2 C
7 3 D
8 5 B
编辑:
首先:
s = df.stack()
df = s[s!=0].reset_index()
df.columns= ['id','result','vals']
print (df)
id result vals
0 0 A 3
1 0 D 1
2 1 A 4
3 1 B 1
4 2 A 1
5 2 B 7
6 2 C 20
7 3 D 4
8 5 B 1
第二:
df = pd.DataFrame({'id':df.index.values[i],
'result':df.columns.values[c],
'vals':df.values[i,c]})
推荐阅读
- c# - 如何在使用 < 运算符 C# 的程序启动期间加载 .dat 文件
- postgresql - 将数据从 postgres 导入到 cytoscape
- c# - 使用反射从 Class 属性中获取 DisplayNames 列表
- html - 在编辑输入之前,Angular 所需的验证不会让表单有效
- java - 如何在 Eclipse RCP 3 中使用 dnd 打开一个新的编辑器
- solidity - 试图在solidity中创建一个可变大小的数组
- dart - 用异步变量初始化类
- c# - 我需要在任何事件处理程序之外执行一些代码。在 C# Windows 窗体中可以做到这一点吗?
- android - Android Studio 在生成签名 Apk 时冻结
- sql-server - 使用 Excel vba 从 SQL Server 获取数据并修改其中一些,然后更新表