首页 > 解决方案 > 熊猫融化2组柱子

问题描述

我有一张桌子

id   name  sec1   sec2   sec3  sec4  sec5  sec6
1    abc   mp(6)  up(7)  sp(8) cp(7)  2     4  

我想输出为

id   name   tests  values   slots
1    abc     mp     6        2
1    abc     up     7        2
1    abc     sp     8        2
1    abc     cp     7        2
1    abc     mp     6        4
1    abc     up     7        4
1    abc     sp     8        4
1    abc     cp     7        4

有人可以帮我用融化来规范这个吗?提前致谢

标签: pythonpandasdataframenormalizationmelt

解决方案


首先我们从set_indexand开始stack()

然后我们提取测试值并将其放在自己的列中并重置索引:

s = df.set_index(['id','name'],append=True).stack().to_frame('tests')
s['values'] = s['tests'].str.extract('(\d+)')[0]
df1 = s.dropna(subset=['values']).reset_index([1,2,3])
df1['tests'] = df1['tests'].str.replace('\(.*\)','')

print(df1)
   id name level_3 tests values
0   1  abc    sec1    mp      6
0   1  abc    sec2    up      7
0   1  abc    sec3    sp      8
0   1  abc    sec4    cp      7

好的,现在我们需要一些与 SQL 中的交叉连接非常相似的东西,即根据len插槽的重复数据帧并相应地添加每个值。

请注意,这是您的数据框的产品,更好的方法是使用合并,但您没有明确输入,例如多行的显示方式。

pd.concat让我们使用参数来试试这个keys

vals = s.loc[s['values'].isna(),'tests'].values

final = pd.concat([df1 ]* len(vals),0,keys=vals)\
            .reset_index(0).rename(columns={'level_0' : 'slots'})

print(final[['id','name','tests','values','slots']])

   id name tests values  slots
0   1  abc    mp      6      2
0   1  abc    up      7      2
0   1  abc    sp      8      2
0   1  abc    cp      7      2
0   1  abc    mp      6      4
0   1  abc    up      7      4
0   1  abc    sp      8      4
0   1  abc    cp      7      4

避免使用以下产品merge

vals = s.loc[s['values'].isna(), 'tests'].reset_index([2,3],drop=True)\
                   .to_frame('slots').reset_index(1)


print(pd.merge(df1,vals,on=['id']))


   id name level_3 tests values slots
0   1  abc    sec1    mp      6     2
1   1  abc    sec1    mp      6     4
2   1  abc    sec2    up      7     2
3   1  abc    sec2    up      7     4
4   1  abc    sec3    sp      8     2
5   1  abc    sec3    sp      8     4
6   1  abc    sec4    cp      7     2
7   1  abc    sec4    cp      7     4

推荐阅读