将字典转换为数据框,然后将列熔化/堆叠为行
Converting dictionary to dataframe, and then melting / stacking columns to rows
我对如何正确使用 melt
或 stack
来转换我的数据框有点困惑。
目前有一个如下所示的数据框:
我的 objective 是要转换此数据框(可能使用 melt
或 stack
),但我在这样做时遇到了一些麻烦。我的 objective 是让我的数据框看起来像这样:
我的数据目前存储在 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
添加一列。
- 确定初始列名称是否列出了 T1 或 T2,并将其放入正确的列中,
T1
或 T2
使用 melt
或 stack
。
感谢您提供的任何支持!
使用 str.split
first by _
in columns, then reshape by 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
我对如何正确使用 melt
或 stack
来转换我的数据框有点困惑。
目前有一个如下所示的数据框:
我的 objective 是要转换此数据框(可能使用 melt
或 stack
),但我在这样做时遇到了一些麻烦。我的 objective 是让我的数据框看起来像这样:
我的数据目前存储在 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
添加一列。 - 确定初始列名称是否列出了 T1 或 T2,并将其放入正确的列中,
T1
或T2
使用melt
或stack
。
感谢您提供的任何支持!
使用 str.split
first by _
in columns, then reshape by 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