【问题标题】:Converting dictionary to dataframe, and then melting / stacking columns to rows将字典转换为数据框,然后将列融合/堆叠为行
【发布时间】:2021-03-18 16:22:20
【问题描述】:

我对如何正确使用meltstack 来转换我的数据框感到有些困惑。

目前有一个如下所示的数据框:

我的目标是转换这个数据框(可能使用meltstack),但我在这样做时遇到了一些麻烦。我的目标是让我的数据框看起来像这样:

我的数据目前存储在dict

{'K_T1': [84.51865079365093,
  84.51865079365093,
  83.80912698412698,
  83.80912698412698,
  86.56468253968255,
  86.56468253968255],
 'K_T2': [77.26309523809515,
  77.26309523809515,
  77.57777777777771,
  77.57777777777771,
  77.09999999999992,
  77.09999999999992],
 'Z_T1': [83.80912698412698,
  83.80912698412698,
  86.61111111111107,
  86.61111111111107,
  87.81746031746032,
  87.81746031746032],
 'Z_T2': [77.57777777777771,
  77.57777777777771,
  75.8619047619048,
  75.8619047619048,
  74.79007936507927,
  74.79007936507927]}

伪代码:

  • 将我的dict 转换为数据框:K_Z_Averages_df = pd.DataFrame.from_dict(K_Z_Averages)
  • Part Name添加一列。
  • 使用meltstack 确定初始列名称是否列出了T1 或T2 并将其放入正确的列T1T2

感谢您提供的任何支持!

【问题讨论】:

    标签: python pandas stack melt


    【解决方案1】:

    首先在列中使用str.split _,然后通过一些数据清理通过DataFrame.stack 重塑:

    df.columns = df.columns.str.split('_', expand=True)
    df = (df.stack(0)
            .sort_index(level=1)
            .rename_axis([None, 'Part Name'])
            .reset_index(level=1)
            .reset_index(drop=True))
    print (df)
       Part Name         T1         T2
    0          K  84.518651  77.263095
    1          K  84.518651  77.263095
    2          K  83.809127  77.577778
    3          K  83.809127  77.577778
    4          K  86.564683  77.100000
    5          K  86.564683  77.100000
    6          Z  83.809127  77.577778
    7          Z  83.809127  77.577778
    8          Z  86.611111  75.861905
    9          Z  86.611111  75.861905
    10         Z  87.817460  74.790079
    11         Z  87.817460  74.790079
    

    wide_to_long 的另一个想法,并在 _ 之前和之后使用更改顺序重命名列:

    df.columns = [f'{b}_{a}' for a, b in df.columns.str.split('_')]
    
    df = (pd.wide_to_long(df.reset_index(),
                          stubnames=['T1','T2'],
                          i='index',
                          j='Part Name',
                          sep='_',
                          suffix='\w+')
           .reset_index(level=1).reset_index(drop=True))
    print (df)  
       Part Name         T1         T2
    0          K  84.518651  77.263095
    1          K  84.518651  77.263095
    2          K  83.809127  77.577778
    3          K  83.809127  77.577778
    4          K  86.564683  77.100000
    5          K  86.564683  77.100000
    6          Z  83.809127  77.577778
    7          Z  83.809127  77.577778
    8          Z  86.611111  75.861905
    9          Z  86.611111  75.861905
    10         Z  87.817460  74.790079
    11         Z  87.817460  74.790079       
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-29
      • 2018-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-05
      相关资源
      最近更新 更多