pandas 切换 Dataframe 上的列和行

qf9go6mv  于 2023-01-11  发布在  其他
关注(0)|答案(4)|浏览(129)

我有一个Pandas Dataframe ,我需要“切换”行和列。(转置?枢轴?融化?不知道它是如何被称为):
假设我有2个引用,每个引用有4个步骤,每个步骤有3个变量

df = pd.DataFrame({'ref': ['ref1', 'ref1', 'ref1', 'ref1', 'ref2', 'ref2', 'ref2', 'ref2'],
                   'step': [1, 2, 3, 4, 1, 2, 3, 4],
                   'var_1': [5, 7, 7, 9, 12, 9, 87, 90],
                   'var_2': [11, 8, 10, 6, 6, 9, 12, 9],
                   "var_3": [11, 8, 10, 6, 6, 9, 12, 9]})

我想把这个df转换成这样的形式:

df = pd.DataFrame({'ref': ['ref1', 'ref2'],
>                    'step 1 - var_1': [5, 12],
>                    'step 1 - var_2': [11, 6],
>                    'step 1 - var_3': [11, 6],
>                    'step 2 - var_1': [7, 12],
>                    'step 2 - var_2': [8, 9],
>                    'step 2 - var_3': [8, 9]})

提前谢谢你Best
编辑:格式和图像

lx0bsm1f

lx0bsm1f1#

在一行程序中使用新的"walrus"运算符尝试执行以下操作:

(df_new := df.set_index(['ref', 'step']).unstack().sort_index(level=1, axis=1))\
    .set_axis([f'step {j} - {i}' for i, j in df_new.columns], axis=1)

输出:

step 1 - var_1  step 1 - var_2  step 1 - var_3  step 2 - var_1  step 2 - var_2  step 2 - var_3  step 3 - var_1  step 3 - var_2  step 3 - var_3  step 4 - var_1  step 4 - var_2  step 4 - var_3
ref                                                                                                                                                                                                 
ref1               5              11              11               7               8               8               7              10              10               9               6               6
ref2              12               6               6               9               9               9              87              12              12              90               9               9

详情:

  • set_index,带有列参考和步骤
  • unstack移动到列中的步骤
  • sort_index对列进行排序
  • 使用set_axis和具有f字符串格式的列表解析来展开多索引 Dataframe 列标题

与上述订单输出相同的替代方式,

df_out = df.pivot(index='ref', columns='step').sort_index(level=1, axis=1)
df_out.columns = [f'step {j} - {i}' for i, j in df_out.columns]
x4shl7ld

x4shl7ld2#

一个选项是使用pyjnanitor中的pivot_wideer,通过names_glue参数抽象列重命名:

# pip insall pyjanitor
import pandas as pd
import janitor
(df
.pivot_wider(
    index='ref', 
    names_from='step',  
    values_from = ['var_1', 'var_2', 'var_3'],
    names_glue = "step {step} - {_value}")
.sort_index(axis=1)
) 
    ref  step 1 - var_1  step 1 - var_2  step 1 - var_3  ...  step 3 - var_3  step 4 - var_1  step 4 - var_2  step 4 - var_3
0  ref1               5              11              11  ...              10               9               6               6
1  ref2              12               6               6  ...              12              90               9               9

[2 rows x 13 columns]

names_glue允许组合使用values_fromnames_from参数-在上面的代码中,{step}是names_from参数,而{_value}values_from的占位符
如果我们严格按照您的输出,那么就应该在step列上执行一个过滤器,只过滤小于3的值:

(df
.loc[df.step < 3]
.pivot_wider(
    index='ref', 
    names_from='step', 
    names_glue = "step {step} - {_value}")
.sort_index(axis=1)
) 
    ref  step 1 - var_1  step 1 - var_2  step 1 - var_3  step 2 - var_1  step 2 - var_2  step 2 - var_3
0  ref1               5              11              11               7               8               8
1  ref2              12               6               6               9               9               9
iyfamqjs

iyfamqjs3#

用途:

df[df.step<3].set_index(['ref','step']).unstack()

输出:

var_1    var_2    var_3   
step     1  2     1  2     1  2
ref                            
ref1     5  7    11  8    11  8
ref2    12  9     6  9     6  9
llycmphe

llycmphe4#

诀窍是使用df.pivot。您可以选择index='ref'columns='step'

new = df.pivot(index='ref', columns='step')

生成的表有一个ref的多索引和一个多列,多列包含step和var信息,因此我们可以使用这些信息来创建新的列标题,最后,我们可以重置索引:

new.columns = [f'step {x[1]} - {x[0]}' for x in new.columns]
new = new.reset_index()

相关问题