将列附加到具有重复行的pandas数据帧

时间:2016-09-07 18:21:19

标签: python pandas

如何将data数据框中的列附加到q数据框,同时在q中保持相同的行数和行数?挑战在于dataq中可能存在重复。

In [2]: data = pd.DataFrame([[3,4,333],[5,6,111],[2,9,222],[5,6,111]], columns=['a','b','id'])

In [3]: data.index = data.id

In [4]: q = pd.DataFrame([[333],[111]], columns=['id'])

In [5]: q.index = q.id

In [6]: data
Out[6]: 
     a  b   id
id            
333  3  4  333
111  5  6  111
222  2  9  222
111  5  6  111

In [7]: q
Out[7]: 
      id
id      
333  333
111  111

结果应该类似于:

   a  b   id
0  3  4  333
1  5  6  111

一些不起作用的东西:

pd.merge(q, data, how='left')
data.ix[q.iloc[:,0],['a','b','id']]

我不想在unique上执行data,因为这会创建另一个大对象。

2 个答案:

答案 0 :(得分:1)

您可以使用join将两个数据框的列连接到公共索引id上。然后,如果存在,请删除重复的值以及删除Nans

data[['a', 'b']].join(q['id'])                           \
                .drop_duplicates()                       \ 
                .dropna()                                \ 
                .sort_values('id', ascending=False)      \
                .reset_index(drop=True)                  \
                .astype(int)                              

   a  b   id
0  3  4  333
1  5  6  111

答案 1 :(得分:0)

没有重复项的一种可能解决方案是!pip install psycopg2 cumcount创建新列,然后在DataFramesid创建merge。最后需要按drop删除列g并重新排序列:

g

使用drop_duplicates很容易:

data['g'] = data.groupby('id').cumcount()
q['g'] = q.groupby('id').cumcount()

print (data)
     a  b   id  g
id               
333  3  4  333  0
111  5  6  111  0
222  2  9  222  0
111  5  6  111  1

print (q)
      id  g
id         
333  333  0
111  111  0

print (pd.merge(q, data, on=['id','g'], how='left')
         .drop('g', axis=1)[['a','b','id']])

   a  b   id
0  3  4  333
1  5  6  111