2015-01-26 2 views
2

У меня есть 2 DataFrames:, как объединить две панды DataFrames и агрегатный один конкретный столбец

  city count school 
0 New York  1 school_3 
1 Washington  1 School_4 
2 Washington  1 School_5 
3   LA  1 School_1 
4   LA  1 School_4 

     city count school 
0 New York  1 School_3 
1 Washington  1 School_1 
2   LA  1 School_3 
3   LA  2 School_4 

Я хочу, чтобы получить этот результат:

  city count school 
0 New York  2 school_3 
1 Washington  1 School_1 
2 Washington  1 School_4 
3 Washington  1 School_5 
4   LA  1 School_1 
5   LA  1 School_3 
6   LA  3 School_4 

Ниже приведен код.

d1 = [{'city':'New York', 'school':'school_3', 'count':1}, 
     {'city':'Washington', 'school':'School_4', 'count':1}, 
     {'city':'Washington', 'school':'School_5', 'count':1}, 
     {'city':'LA', 'school':'School_1', 'count':1}, 
     {'city':'LA', 'school':'School_4', 'count':1}] 


d2 = [{'city':'New York', 'school':'School_3', 'count':1}, 
     {'city':'Washington', 'school':'School_1', 'count':1}, 
     {'city':'LA', 'school':'School_3', 'count':1}, 
     {'city':'LA', 'school':'School_4', 'count':2}] 

x1 = pd.DataFrame(d1) 
x2 = pd.DataFrame(d2) 
#just get empty DataFrame 
print pd.merge(x1, x2) 

Как получить итоговый результат?

ответ

4

Вы можете сделать:

>>> pd.concat([x1, x2]).groupby(["city", "school"], as_index=False)["count"].sum() 
     city school  count 
0   LA School_1  1 
1   LA School_3  1 
2   LA School_4  3 
3 New York School_3  1 
4 New York school_3  1 
5 Washington School_1  1 
6 Washington School_4  1 
7 Washington School_5  1 

Обратите внимание, что в Нью-Йорке появляется в 2 раза из-за опечатки в данных (против School_3).

+0

Ох. это ошибка. Благодарю. – wangke1020

1

Вот несколько отличается реализация от @ elyase, решение которого с помощью pandas.DataFrame.merge(...)

x1.merge(x2,on=['city', 'school', 'count'], how='outer').groupby(['city', 'school'], as_index=False)['count'].sum() 

Когда истекло в ipython notebook %timeit этот метод немного быстрее, чем @ elyase (в < 1мс)

100 loops, best of 3: 6.25 ms per loop #using concat(...) with @elyase's solution 
100 loops, best of 3: 5.49 ms per loop #using merge(...) in this solution 

Кроме того, если вы хотите для использования pandas aggregate функциональность вы также можете сделать:

x1.merge(x2,on=['city', 'school', 'count'], how='outer').groupby(['city', 'school'], as_index=False).agg(numpy.sum) 

Единственное исключение заключается в том, что использование agg(...) является самым медленным из 3-х решений.

Очевидно, что все 3 обеспечивают правильный результат:

  city school count 
0   LA School_1  1 
1   LA School_3  1 
2   LA School_4  3 
3 New York School_3  1 
4 New York school_3  1 
5 Washington School_1  1 
6 Washington School_4  1 
7 Washington School_5  1 
Смежные вопросы