熊猫合并两个没有交叉引用的数据框,并使用NaN合并以实现行数不均

时间:2019-03-04 10:20:59

标签: python pandas

编辑日期3/5/19:

尝试了不同的方式来合并和/或合并下面的数据,但是无法正确地解决问题。

最初我有这样的数据:

index  unique_id  group_name  id  name
0      100        ABC         20  aaa
1      100        ABC         21  bbb
2      100        DEF         22  ccc
3      100        DEF         23  ddd
4      100        DEF         24  eee
5      100        DEF         25  fff
6      101        ABC         30  ggg
7      101        ABC         31  hhh
8      101        ABC         32  iii
9      101        DEF         33  jjj

目标是通过合并unique_id来重塑它,以便结果看起来像这样:

index  unique_id  group_name_x  id_x   name_x  group_name_y  id_y  name_y
0      100        ABC           20     aaa     DEF           22    ccc
1      100        ABC           21     bbb     DEF           23    ddd
2      100        NaN           NaN    NaN     DEF           24    eee
3      100        NaN           NaN    NaN     DEF           25    fff
4      101        ABC           30     ggg     DEF           33    jjj
5      101        ABC           31     hhh     NaN           NaN   NaN
6      101        ABC           32     iii     NaN           NaN   NaN

如何在熊猫中做到这一点?我能想到的最好的办法是按组名(ABC和DEF)将数据分为两个数据帧,然后将它们与how='outer', on='unique_id'合并,但是这样一来,它会在每个记录之间创建引用(2 ABC x 4 DEF = 8记录),没有任何NaN。

答案中提到的

pd.concataxis=1不会按照unique_id对齐数据,也不会创建任何NaN。

1 个答案:

答案 0 :(得分:0)

如您所说,重置两个索引后,按行拆分数据框,然后concat

有效代码

df=pd.read_clipboard()
req_cols=['group_name','id','name']
df_1=df[df['group_name']=='ABC'].reset_index(drop=True)
df_2=df[df['group_name']=='DEF'].reset_index(drop=True)
df_1=df_1.rename(columns = dict(zip(df_1[req_cols].columns.values, df_1[req_cols].add_suffix('_x'))))
df_2=df_2.rename(columns = dict(zip(df_2[req_cols].columns.values, df_2[req_cols].add_suffix('_y'))))
req_cols_x=[val+'_x'for val in req_cols]
print (pd.concat([df_2,df_1[req_cols_x]],axis=1))

O / P:

   index  unique_id group_name_y  id_y name_y group_name_x  id_x name_x
0      2        100          DEF    22    ccc          ABC  20.0    aaa
1      3        100          DEF    23    ddd          ABC  21.0    bbb
2      4        100          DEF    24    eee          NaN   NaN    NaN
3      5        100          DEF    25    fff          NaN   NaN    NaN