2015-03-02 3 views
0

Предположив У меня есть кадр данных следующим образом:панды слияния и заполнить dataframe с суммарными данными

frameA = pandas.DataFrame(dict(title=['a','a','a','b','b','b'],value=[1,2,3,4,5,6])) 
frameB = pd.DataFrame(dict(title=['a','b'],value=[10,20])) 

frameA выглядит

title value 
0  a  1 
1  a  2 
2  a  3 
3  b  4 
4  b  5 
5  b  6 

и frameB выглядит

title value 
0  a  10 
1  b  20 

I Я хотел бы сделать какое-то слияние или присоединиться, чтобы получить

title value value2 
    a  1  10 
    a  2  10 
    a  3  10 
    b  4  20 
    b  5  20 
    b  6  20 

Я попытался pd.concat([frameA,frameB],axis=1) и frameA.merge(frameB) и frameA.apply(lambda x: frameB[x.title])

Ни одна из которых работы. Я уверен, что есть действительно очевидный способ, но я просто не могу найти его в данный момент. Благодаря

========================================

и сразу после того, как я опубликовал это, я наткнулся на

Merging pandas dataframes using date as index, кажется, показывает в одну сторону. Есть ли другие?

ответ

3

Другой способ объединения:

frameA.merge (frameB, на = 'название', как = 'левый')

title value_x value_y 
0 a  1  10 
1 a  2  10 
2 a  3  10 
3 b  4  20 
4 b  5  20 
5 b  6  20 
1

Более быстрый метод, который не требует переименования/удаления столбцов, заключается в том, чтобы установить индекс frameB в title и позвоните по телефону map на фрейме, проходящем в другом df и проходящем ряд. Это будет выполнять поиск, используя значение заголовка и возвращает значения, которые соответствуют:

In [85]: 

frameB.set_index('title', inplace=True) 
frameA['value2'] = frameA['title'].map(frameB['value']) 
frameA 
Out[85]: 
    title value value2 
0  a  1  10 
1  a  2  10 
2  a  3  10 
3  b  4  20 
4  b  5  20 
5  b  6  20 

Если мы сравним производительность слияния с картой, мы можем видеть, что карта намного быстрее, почти 5X быстрее:

In [70]: 

%timeit pd.merge(frameA,frameB,on='title',how='left') 
1000 loops, best of 3: 1.42 ms per loop 
In [83]: 

frameB.set_index('title', inplace=True) 
%timeit frameA['value2'] = frameA['title'].map(frameB['value']) 
1000 loops, best of 3: 286 µs per loop 
Смежные вопросы