Pandas:如何将行转为列

2024-04-29 13:53:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种方法,将大约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

Tags: 方法示例dfvaluecolumnokbadgood
3条回答

您可以使用熔化功能:

(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

您可以按如下方式使用^{}。使用^{}是首选,因为它自然会导致行已经按照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

添加数据帧:

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

enter image description here

可选:分组方式-对于总和或平均值:

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

enter image description here

enter image description here

相关问题 更多 >