Pandas:如何将行转为列

Pandas: How to pivot rows into columns

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

df:

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

你可以使用 .stack() as follows. Using .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

可以使用熔化函数:

(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

添加数据框:

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

可选:分组依据 - 总和或平均值:

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