成对融化在 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
我想成对创建一个新的数据框。我尝试使用 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