我想配对创建一个新的数据框。我尝试使用MELT,但实际上没有用。如果您发现列是成对的(即code:type,code1:type1)我尝试创建代码列列表和类型列列表,然后合并。
您如何建议这个问题?如果能给出一些解释,我将不胜感激。
原始数据帧:
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
:
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
使用pd.concat([df1.df2],axix = 1)我可以将其连接并删除NULL值。