0

我正在寻找一种将大约 600 列旋转为行的方法。这是一个只有 4 个列的示例(好、坏、好、可怕):

东风:

RecordID   good   bad   ok  Horrible
  A          0      0    1     0 
  B          1      0    0     1

所需的输出:

 RecordID     Column    Value
   A           Good       0
   A            Bad       0
   A            Ok        1
   A          Horrible    0
   B           Good       1
   B            Bad       0
   B            Ok        0
   B          Horrible    1
4

3 回答 3

1

您可以使用融化功能:

(df.melt(id_vars='RecordID', var_name='Column', value_name='Value')
   .sort_values('RecordID')
   .reset_index(drop=True)
)

输出:

    RecordID      Column    Value
0          A        good        0
1          A         bad        0
2          A          ok        1
3          A    Horrible        0
4          B        good        1
5          B         bad        0
6          B          ok        0
7          B    Horrible        1
于 2021-04-07T19:22:54.197 回答
1

您可以.stack()如下使用。首选使用.stack(),因为它自然会导致已按顺序排序的行,RecordID因此您无需浪费处理时间再次对其进行排序,当您有大量列时尤其重要

df = df.set_index('RecordID').stack().reset_index().rename(columns={'level_1': 'Column', 0: 'Value'})

输出:

  RecordID    Column  Value
0        A      good      0
1        A       bad      0
2        A        ok      1
3        A  Horrible      0
4        B      good      1
5        B       bad      0
6        B        ok      0
7        B  Horrible      1
于 2021-04-07T19:19:15.920 回答
1

添加数据框:

import pandas as pd
import numpy as np

data2 = {'RecordID': ['a', 'b', 'c'],
        'good': [0, 1, 1],
        'bad': [0, 0, 1],
        'horrible': [0, 1, 1],
        'ok': [1, 0, 0]}
  
# Convert the dictionary into DataFrame
df = pd.DataFrame(data2)

融化数据: https ://pandas.pydata.org/docs/reference/api/pandas.melt.html

melted = df.melt(id_vars='RecordID', var_name='Column', value_name='Value')
melted

在此处输入图像描述

可选: Group By - 求和或平均值:

f2 = melted.groupby(['Column']).sum()
df2

在此处输入图像描述

在此处输入图像描述

于 2021-04-07T19:42:44.207 回答