Pandas在单独的列中合并具有ID的行

时间:2017-09-28 08:28:37

标签: python pandas

这里完全崩溃,需要一些帮助。

我有一个带有+ 10米行的DataFrame和带有两个ID的大约150列,如下所示:

df = pd.DataFrame({'id1' : [1,2,5,3,6,4]
              ,'id2' : [2,1,np.nan,4,np.nan,3]
              ,'num' : [123, 3231, 123, 231, 6534,2394]})


    id1 id2 num
0   1   2.0 123
1   2   1.0 3231
2   5   NaN 123
3   3   4.0 231
4   6   NaN 6534
5   4   3.0 2394

其中行索引0和1是给定id1和id2的对,行索引3和5是相同方式的一对。我想要下面的表格,其中第二行对与第一行对合并

df = pd.DataFrame({'id1' : [1,5,3,6]
              ,'id2' : [2,np.nan,3,np.nan]
              ,'num' : [123, 123, 231, 6534]
              ,'2num' : [3231, np.nan, 2394, np.nan,]})


    id1 id2  num  2_num
0   1   2.0  123  3231.0
1   5   NaN  123  NaN
2   3   3.0  231  2394.0
3   6   NaN  6534 NaN

如何使用id1和id2存档并将“id row 2”中的所有后续列标记为“2 _”?

3 个答案:

答案 0 :(得分:3)

这是一个基于合并的方法,(谢谢@pirSquared改进)。即

ndf = df.merge(df, 'left', left_on=['id1', 'id2'], right_on=['id2', 'id1'], suffixes=['', '_2']).drop(['id1_2', 'id2_2'], 1)
cols = ['id1','id2']
ndf[cols] = np.sort(ndf[cols],1)
new  = ndf.drop_duplicates(subset=['id1','id2'],keep='first')
  id1  id2   num   num_2
0  1.0  2.0   123  3231.0
2  5.0  NaN   123     NaN
3  3.0  4.0   231  2394.0
4  6.0  NaN  6534     NaN

答案 1 :(得分:2)

我们的想法是对每对id进行排序,以便我们将它们分组。

cols = ['id1', 'id2']
df[cols] = np.sort(df[cols], 1)

df.set_index(
    cols + [df.fillna(-1).groupby(cols).cumcount() + 1]
).num.unstack().add_suffix('_num').reset_index()

   id1  id2   1_num   2_num
0  1.0  2.0   123.0  3231.0
1  3.0  4.0   231.0  2394.0
2  5.0  NaN   123.0     NaN
3  6.0  NaN  6534.0     NaN

答案 2 :(得分:1)

使用:

df[['id1','id2']] = pd.DataFrame(np.sort(df[['id1','id2']].values, axis=1)).fillna('tmp')
print (df)
   id1  id2   num
0  1.0    2   123
1  1.0    2  3231
2  5.0  tmp   123
3  3.0    4   231
4  6.0  tmp  6534
5  3.0    4  2394

df1 = df.groupby(['id1','id2'])['num'].apply(list)
print (df1)
id1  id2
1.0  2.0    [123, 3231]
3.0  4.0    [231, 2394]
5.0  tmp          [123]
6.0  tmp         [6534]
Name: num, dtype: object

df2 = pd.DataFrame(df1.values.tolist(), 
                  index=df1.index, 
                  columns=['num','2_num'])
        .reset_index().replace('tmp', np.nan)

print (df2)
   id1  id2   num   2_num
0  1.0  2.0   123  3231.0
1  3.0  4.0   231  2394.0
2  5.0  NaN   123     NaN
3  6.0  NaN  6534     NaN