python - 如何在 pandas 中将 m×m 数据帧转换为 m*m×3 数据帧?
问题描述
我有一个像这样的熊猫数据框:
df = pd.DataFrame({'A':[1,3,2,9],'B':[2,1,2,7],'C':[7,2,4,6],'D':[8,1,6,4]},index=['A','B','C','D'])
>> A B C D
A 1 2 7 8
B 3 1 2 1
C 2 2 4 6
D 9 7 6 4
我想将此数据框更改为具有相应值的对,如下所示:
>> col1 col2 val
A A 1
A B 3
A C 2
A D 9
... ... ...
D C 6
D D 4
一种方法是使用循环,但是对于非常大的数据帧,这将非常慢。有一些问题可以解决类似的问题,但对于 R。我猜一种方法是将数据帧转换为 numpy 矩阵,然后使用堆栈函数。但我无法从中创建一个 m×3 数组。有人可以帮忙吗?
解决方案
DataFrame.stack
与 一起使用Series.reset_index
:
df = df.stack().reset_index()
df.columns = ['col1','col2','val']
numpy.repeat
或使用,numpy.tile
和numpy 解决方案ravel
:
a = np.repeat(df.index, len(df.columns))
b = np.tile(df.columns, len(df))
c = df.values.ravel()
df = pd.DataFrame({'col1':a,'col2':b,'val':c})
print (df)
col1 col2 val
0 A A 1
1 A B 2
2 A C 7
3 A D 8
4 B A 3
5 B B 1
6 B C 2
7 B D 1
8 C A 2
9 C B 2
10 C C 4
11 C D 6
12 D A 9
13 D B 7
14 D C 6
15 D D 4
具有不同val
列顺序的解决方案melt
和DataFrame.reset_index
,对于相同的列顺序添加reindex
:
df = (df.rename_axis('col2')
.reset_index()
.melt('col2', var_name='col1', value_name='val')
.reindex(columns=['col1','col2','val']))
a = np.repeat(df.columns, len(df.columns))
b = np.tile(df.index, len(df))
c = df.values.T.ravel()
df1 = pd.DataFrame({'col1':a,'col2':b,'val':c})
print (df)
col1 col2 val
0 A A 1
1 A B 3
2 A C 2
3 A D 9
4 B A 2
5 B B 1
6 B C 2
7 B D 7
8 C A 7
9 C B 2
10 C C 4
11 C D 6
12 D A 8
13 D B 1
14 D C 6
15 D D 4
推荐阅读
- javascript - VBA:如何在图像上没有 ID 或名称的情况下触发 onclick 事件?
- javascript - Javascript 变量的 HTML 输入表单
- python - 在 Python 中访问类变量与实例变量
- java - 我如何用正则表达式替换这个函数
- javascript - select2 在用户选择之前将输入的文本应用为标签
- java - Project Reactor:设计一个反应式 API
- php - Style.css 不适用于我的自定义 wordpress 主题
- html - 如何在导航中使用两个浮点数
- android - 调试时失去与设备的连接
- php - 将日期与时区进行比较得到错误的评估