2013-05-01 8 views
5

Jeśli mam dwie ramki danych (lub serie), które są już posortowane na zgodnych kluczach, chciałbym móc tanio je scalić i zachować sortowanie. Nie widzę sposobu, aby to zrobić inny niż poprzez concat() oraz wyraźnej rodzaju()Czy istnieje skuteczny sposób scalania dwóch sortowanych ramek danych w pandach, zachowując sortowanie?

a = pd.DataFrame([0,1,2,3], index=[1,2,3,5], columns=['x']) 
b = pd.DataFrame([4,5,6,7], index=[0,1,4,6], columns=['x']) 
print pd.concat([a,b]) 
print pd.concat([a,b]).sort() 

    x 
1 0 
2 1 
3 2 
5 3 
0 4 
1 5 
4 6 
6 7 

    x 
0 4 
1 0 
1 5 
2 1 
3 2 
4 6 
5 3 
6 7 

Wygląda nastąpił nieco powiązanej dyskusji z NumPy tablic, co sugeruje „przeplotu” metodę, ale nie znalazłem dobrej odpowiedzi.

+0

Dobre pytanie! Interweave różni się od sortowania dwóch już posortowanych tablic, ale jestem pewny, że widziałem pytanie o sortowanie dwóch już posortowanych tablic w numpy (nie mogę tego znaleźć) ... musi to być część implementacji mergesort ...: s –

+1

http://stackoverflow.com/questions/12427146/combine-two-arrays-and-sort –

+0

Podobają mi się sugestie heapq.merge() w tamtejszych artykułach, może mogę to wykorzystać, ale robi to Wydaje się, że jesteś rodzimą, bezduszną rzeczą? Chcę skorzystać z sortowania, ponieważ przy bardzo dużych łączeniach szeregowych, gdy wiemy, że sortowane powinny być liniowe w całkowitej długości tablic, podczas gdy jakiekolwiek sortowanie będzie nieliniowe. (Jak na ironię, gdy zacząłem używać pand, założyłem, że operacja "scalania" zrobiła właśnie to, zamiast być formą łączenia.) – patricksurry

Odpowiedz

0

Jeśli mamy ograniczyć problem do a i b posiadające tylko jedną kolumnę, to chciałbym przejść przez tę drogę:

s = a.merge(b, how='outer', left_index=True, right_index=True) 
s.stack().reset_index(level=1, drop=True) 
Powiązane problemy