如何将data
数据框中的列附加到q
数据框,同时在q
中保持相同的行数和行数?挑战在于data
和q
中可能存在重复。
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
,因为这会创建另一个大对象。
答案 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
创建新列,然后在DataFrames
和id
创建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