我有一个熊猫数据框,每个对象有一行。在该对象中,有子对象。我想创建一个数据框,每个子对象包含一行。
我已经阅读了融解的内容,但无法开始研究如何将其用于我想做的事情。
我想去
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
答案 0 :(得分:9)
执行此操作的一种方法是将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
答案 1 :(得分:0)
您可以合并子数据帧:
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
答案 2 :(得分:0)
另一种方式是:
Sub_ID
列将数据框拆分为两个不同的数据框splitting
在_
上以一般方式重命名列axis=0
上连接数据帧(彼此顶部)d1 = df.set_index('ObjectID').loc[:, 'Sub1_ID':'Sub1_Var3']
d2 = df.set_index('ObjectID').loc[:, 'Sub2_ID':]
d1.columns = d1.columns.str.split('_').str[1]
d2.columns = d2.columns.str.split('_').str[1]
pd.concat([d1, d2[d2['ID'].ne(0)]]).sort_index().reset_index()
ObjectID ID Var1 Var2 Var3
0 1 98398 3 10 9
1 1 19231 6 7 5
2 2 87868 8 5 4
3 3 4579 5 6 6
4 3 24833 6 2 2
5 4 2514 1 6 9