成对融化在 pandas 数据框中

pair wise melt in pandas dataframe

我想成对创建一个新的数据框。我尝试使用 MELT,但它并没有真正起作用。 如果您注意到列是成对的(即 code:type , code1:type1 ) 我尝试创建一个代码列列表和类型列列表,然后进行 melt。

你会如何建议这个问题?如果给出一些解释,我将不胜感激。

原始数据框:

id   Name  code code1 code2  type type1 type2
 0    ABC    1      4     8   S     E      T
 1    XYZ    2            5   R            U

预期的数据帧

id name  Code_All Type_All
0   ABC      1      S
0   ABC      4      E
0   ABC      8      T
1   XYZ      2      R
1   XYZ               
1   XYZ      5      U

这里的问题是我们没有 pd.wide_to_long 的明确后缀(每个组的第一个条目没有后缀),因此先修改列然后应用 pd.wide_to_long:

m  = df.set_index(['id','Name'])
cols = m.columns.str.replace('\d+','').to_series()
m.columns=cols.add(cols.groupby(cols).cumcount().astype(str))

out = (pd.wide_to_long(m.reset_index(),['code','type'],['id','Name'],'idx')
                                              .reset_index(['id','Name']))

     id Name  code type
idx                    
0     0  ABC   1.0    S
1     0  ABC   4.0    E
2     0  ABC   8.0    T
0     1  XYZ   2.0    R
1     1  XYZ   NaN  NaN
2     1  XYZ   5.0    U

重现数据帧的代码:

d = {'id': {0: 0, 1: 1},
  'Name': {0: 'ABC', 1: 'XYZ'},
  'code': {0: 1, 1: 2},
  'code1': {0: 4.0, 1: np.nan},
  'code2': {0: 8, 1: 5},
  'type': {0: 'S', 1: 'R'},
  'type1': {0: 'E', 1: np.nan},
  'type2': {0: 'T', 1: 'U'}}
df = pd.DataFrame(d)

经过几个令人沮丧的小时后,我能够使用肮脏的技巧完成此操作。

我将数据集一分为二。

id, name, code1, code2, code3

id, name, type1, type2, type3

我调换了两个数据帧

第一个数据帧的例子。

id, name, code1

id, name, code2

id, name, code3

使用 pd.concat([df1.df2], axix=1) 我能够连接它并删除 NULL 值和重复的列名

最终数据框

id, name, code1, type1

id, name, code2, type2

id, name, code3, type3