Mam pandową ramkę danych, która ma dwie kluczowe kolumny i chcę zapewnić, że kartezjański produkt tych kluczy istnieje w tabeli (ponieważ będę musiał wykonać Wykres 2D zawierający wszystkie kombinacje). Mam problem z wymyśleniem dość krótkiego i idiomatycznego sposobu na zrobienie tego.upewniając się, że kartezjański produkt kluczy pojawia się w tabeli Pandy
Na przykład, zacznę ten stół dając kombinacje owoców i warzyw, i jak smakują razem:
combo fruit veg
0 tasty apple carrot
1 yucky banana carrot
2 tasty banana lettuce
3 yucky lemon lettuce
Chcę skończyć z tej tabeli, w której występują wszystkie możliwe kombinacje:
fruit veg combo
0 apple carrot tasty
1 apple lettuce UNKNOWN
2 banana carrot yucky
3 banana lettuce tasty
4 lemon carrot UNKNOWN
5 lemon lettuce yucky
Oto najlepszy sposób znalazłem to zrobić:
import pandas as pd
# Initial data
df=pd.DataFrame(dict(fruit=['apple','banana','banana','lemon'],
veg=['carrot','carrot','lettuce','lettuce'],
combo=['tasty','yucky','tasty','yucky']))
# Solution starts here
veg=df.groupby('veg').size().reset_index()
fruit=df.groupby('fruit').size().reset_index()
fruit[0] = veg[0] = 0 #use this dummy column for the join to work!
cartesian = pd.merge(fruit, veg, how='outer', on=0)
del cartesian[0]
all_combos = pd.merge(cartesian, df, how='left')
all_combos[ pd.isnull(all_combos.combo) ] = 'UNKNOWN'
I wyobraź sobie, że musi być prostszy i mniej podatny na błędy sposób, aby to zrobić ... jakąkolwiek radę?
bym szczególnie wdzięczny, jeśli ktoś może mi pokazać jak to zrobić zarówno z jak i bez multi-indeks zawierający fruit
i veg
kolumn, bo jestem naprawdę zastanawiał się, jak to zrobić z indeksami. Bazując na moim doświadczeniu SQL, wydaje mi się, że są to dokładnie sytuacje, dla których przeznaczone są indeksy.
Dzięki, Andy, to działa dobrze dla mnie. Wygląda na to, że istnieje również opcjonalny argument "fill_value" do reindeksu, który może zapisać krok (np. 'Df1.reindex (fruit_x_veg, fill_value = 'UNKNOWN')'. –
@Dan Excellent! Oooh, jak schludnie :) –
@Dan FYI istnieje niedawny [problem github] (https://github.com/pydata/pandas/issues/3835) o dodawaniu tej funkcji natywnie. –