我有一个每个对象一行的pandas数据帧。在该对象中,有一些子对象。我想创建一个每个子对象包含一行的dataframe。
我读过关于melt的东西,但我不知道如何使用它来做我想做的事情。
我想从
ObjectID Sub1_ID Sub1_Var1 Sub1_Var2 Sub1_Var3 Sub2_ID Sub2_Var1 Sub2_Var2 Sub2_Var3
1 98398 3 10 9 19231 6 7 5
2 87868 8 5 4
3 4579 5 6 6 24833 6 2 2
4 2514 1 6 9
至
ObjectID Sub_ID Var1 Var2 Var3
1 98398 3 10 9
1 19231 6 7 5
2 87868 8 5 4
3 4579 5 6 6
3 24833 6 2 2
4 2514 1 6 9
发布于 2019-06-26 23:52:50
一种方法是将MultiIndex与from_arrays
结合使用,然后使用stack
对数据帧进行整形:
df1 = df.set_index('ObjectID')
df1.columns = pd.MultiIndex.from_arrays(zip(*df1.columns.str.split('_')))
df1.stack(0).reset_index().drop('level_1', axis=1)
输出:
ObjectID ID Var1 Var2 Var3
0 1 98398.0 3.0 10.0 9.0
1 1 19231.0 6.0 7.0 5.0
2 2 87868.0 8.0 5.0 4.0
3 3 4579.0 5.0 6.0 6.0
4 3 24833.0 6.0 2.0 2.0
5 4 2514.0 1.0 6.0 9.0
发布于 2019-06-27 00:18:30
你可以拼接子数据帧:
def ren_col(x):
if x.startswith('Obj'): return x
elif x.endswith('ID'): return 'Sub_ID'
else: return x[-4:]
cols = df.columns
resul = pd.concat([df[sub].rename(ren_col, axis=1).dropna()
for sub in [[cols[0]] + cols[i:i+4].tolist()
for i in range(1, len(cols), 4)]]
).sort_values(['ObjectID', 'Sub_ID']).reset_index(drop=True)
不出所料,它提供了:
ObjectID Sub_ID Var1 Var2 Var3
0 1 19231.0 6.0 7.0 5.0
1 1 98398.0 3.0 10.0 9.0
2 2 87868.0 8.0 5.0 4.0
3 3 4579.0 5.0 6.0 6.0
4 3 24833.0 6.0 2.0 2.0
5 4 2514.0 1.0 6.0 9.0
https://stackoverflow.com/questions/56776539
复制相似问题