我正在使用熊猫数据框,这是家庭答复的问卷调查的结果。数据如下所示:
pos gen parent child famid f g h
1 2 200681 68 1 2 3
0 1 100681 68 1 2 3
1 2 200691 69 1 2 3
0 1 100691 69 1 2 3
1 2 200701 70 1 2 3
2 2 200702 70 1 2 3
3 2 200703 70 1 2 3
0 1 100701 70 1 2 3
1 2 200711 71 1 2 3
2 2 200712 71 1 2 3
0 1 100711 71 1 2 3
我想做的是将所有子项和子项的信息放在f到j之间,并将新列(f1-h1表示为兄弟1,f2-h2表示为兄弟2,依此类推)追加到父列的末尾。结果将如下所示:
pos gen parent child1 child2 child3 famid f g h f1 g1 h2 f2 g2 h2 f3...
0 1 100681 200681 68 1 2 3 1 2 3
0 1 100691 200691 69 1 2 3 1 2 3
0 1 100701 200701 200702 200703 70 1 2 3 1 2 3 1 2 3 1 ...
0 1 100711 200711 200712 71 1 2 3 1 2 3 1 2 3
因此,目标是使家庭ID对于每个列都是唯一的,并使用pos列将家庭成员分成新的行。
我一直在搞怪枢轴和堆叠,但是我还没有完全找到完成该任务所需要的东西。不确定枢纽是否是实现此目标的最佳方法,因此我愿意提出建议。
最佳答案
这需要几个步骤,我是通过以下方式解决的:
在famid
上进行分组,并使用','.join
聚合字符串值
同时,重命名列
创建一个具有pos == 0
行的df
将创建的数据框连接到最终数据框
cols_agg = ['child', 'f', 'g', 'h']
df_group1 = df.groupby('famid').agg({cols_agg[0]: ','.join,
cols_agg[1]: ','.join,
cols_agg[2]: ','.join,
cols_agg[3]: ','.join}).reset_index()
groups =[]
for col in enumerate(cols_agg):
groups.append(df_group1[col[1]].str.split(',', expand=True).rename({0:cols_agg[col[0]]+'0',
1:cols_agg[col[0]]+'1',
2:cols_agg[col[0]]+'2',
3:cols_agg[col[0]]+'3'}, axis=1))
df_last = df[df.pos=='0'].iloc[:, :3].reset_index(drop=True)
groups_df = pd.concat(groups, axis=1)
groups_df = pd.concat([df_group1.iloc[:, :1], groups_df], axis=1)
df_final = pd.concat([df_last, groups_df], axis=1).fillna('')
输出量
print(df_final)
pos gen parent famid child0 child1 child2 child3 f0 f1 f2 f3 g0 g1 g2 g3 h0 h1 h2 h3
0 0 1 100681 68 1 1 2 2 3 3
1 0 1 100691 69 200691 1 1 2 2 3 3
2 0 1 100701 70 200701 200702 200703 1 1 1 1 2 2 2 2 3 3 3 3
3 0 1 100711 71 200711 200712 1 1 1 2 2 2 3 3 3
关于python - 在 Pandas 中,是否有办法将行旋转到其他行的末尾?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55482844/