简体   繁体   English

将字典转换为 dataframe,然后将列熔化/堆叠为行

[英]Converting dictionary to dataframe, and then melting / stacking columns to rows

I am a bit confused about how to use melt or stack correctly in order to transform my dataframe.我对如何正确使用meltstack来转换我的 dataframe 有点困惑。

Currently have a dataframe which looks as follows:目前有一个 dataframe 如下所示:

在此处输入图像描述

My objective is to transform this data frame, (probably using melt or stack ), and I'm having some trouble doing so.我的目标是转换这个数据框(可能使用meltstack ),但我在这样做时遇到了一些麻烦。 My objective is to have my dataframe look like this:我的目标是让我的 dataframe 看起来像这样:

在此处输入图像描述

My data is currently stored in a dict :我的数据当前存储在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]}

Pseudocode:伪代码:

  • Convert my dict to a dataframe: K_Z_Averages_df = pd.DataFrame.from_dict(K_Z_Averages)将我的dict转换为 dataframe: K_Z_Averages_df = pd.DataFrame.from_dict(K_Z_Averages)
  • Add a column, for Part Name .Part Name添加一列。
  • Identify if the initial column name has T1 or T2 listed and place it into the correct column, T1 or T2 using melt or stack .确定初始列名称是否列出了 T1 或 T2,并使用meltstack将其放入正确的列T1T2中。

Thanks for any support which can be offered!感谢您提供的任何支持!

Use str.split first by _ in columns, then reshape by DataFrame.stack with some data cleaning:首先使用str.split by _ in columns,然后通过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

Another idea with wide_to_long and rename columns with change order before and after _ : 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       

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM