python - 使用 python/pandas 将任意多列转换为键值对

标签 python pandas dataframe

我正在尝试将一个包含 r 行和 c 列的非常宽的 csv 文件转换为包含 r*c 行和 row_id、col_name、col_value 形式的三列的字典或数据框。由于列数非常大(超过 10,000 个),因此无法手动完成。

假设我从 pandas 数据框开始:

import pandas as pd

df = pd.DataFrame({'id': {0: '1',  1: '2',  2: '3'},
 'c1': {0: 'S', 1: 'S', 2: 'D'},
 'c2': {0: 'XX',  1: 'WX',  2: 'WX'},
 'c3': {0: '32',  1: '63',  2: '32'}})

df = df.set_index('id')

看起来像这样:

    id  c1  c2  c3
0   1   S   XX  32
1   2   S   WX  63
2   3   D   WX  32

请记住,此示例数据框只有三列,但该解决方案需要处理大量列。

目标是将其转换为如下所示的字典或数据框:

    id  key     value
0   1   c1  S
1   1   c2  XX
2   1   c3  32
3   2   c1  S
4   2   c2  WX
5   2   c3  63
6   3   c1  D
7   3   c2  WX
8   3   c3  32

我已经编写了一些东西,通过按列和行从数据帧迭代到新的数据帧来实现所需的输出:

data = []

for i, row in df.iterrows():
    for j, column in row.iteritems():
        a_dictionary = i, j, column
        data.append(a_dictionary)

df_out = pd.DataFrame(data)
df_out.columns = ['id', 'key', 'value']

但是我读到可以而且应该避免在 pandas 和 python 中使用 for 循环。那么正确的解决方案是什么样的?

最佳答案

你可以这样做:

In [212]: df.stack(dropna=False)\
            .reset_index(name='Value')\
            .rename(columns={'level_1': 'key'})                                                                                                                            
Out[212]: 
  id key Value
0  1  c1     S
1  1  c2    XX
2  1  c3    32
3  2  c1     S
4  2  c2    WX
5  2  c3    63
6  3  c1     D
7  3  c2    WX
8  3  c3    32

关于python - 使用 python/pandas 将任意多列转换为键值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61397875/

相关文章:

python - 基于条件的索引范围

python - Pandas:内部联接不返回任何行

python - 使用 m.CV 与 m.Var

python - 将自定义脚本添加到 sphinx 中的某些文档

python - 如何转换这个数据框以获得这个json结构?

python - 有效地将一系列集成到 pandas 数据框中

python - 仅更改 pandas DataFrame 中的数值数据

python - 比较数据框中的列并更新它们

python - 从mac预安装的python文件夹中删除文件

python - Scipy 稀疏矩阵 - 密集向量乘法性能 - block 与大型矩阵