我正在使用熊猫数据框,这是家庭答复的问卷调查的结果。数据如下所示:

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/

10-13 09:32