2016-08-11 14 views
6

Mam dataframe pandy tak:Pandas kolumny swap w oparciu o stan

Col1 Col2 Col3 
0 A  7  NaN 
1 B  16 NaN 
1 B  16 15 

Co chcę zrobić to zamienić COL2 z Col3 gdzie wartość Col3 jest NaN. Na podstawie innych stanowisk i odpowiedzi na SO, Mam ten kod do tej pory:

df[['Col2', 'Col3']] = df[['Col3', 'Col2']].where(df[['Col3']].isnull()) 

Ale to nie wydaje się działać prawidłowo i daje mi następujące:

Col1 Col2 Col3 
0 A  NaN NaN 
1 B  NaN NaN 
1 B  NaN NaN 

Czy jest coś, co ja może tu brakować?

Aktualizacja: My pożądane wyjście wygląda następująco:

Col1 Col2 Col3 
0 A  NaN 7 
1 B  NaN 16 
1 B  16 15 

Dzięki

+0

Co masz na myśli, gdy Col3 to None? Jeśli wszystkie elementy są NaN lub wystarczy jeden element? – ayhan

+1

@ayhan Dla niektórych wierszy wartość Col3 to NaN, a kiedy tak się stanie, chcę zamienić ją na Col2. Redagowałem pytanie, mam nadzieję, że teraz jest jasne. – dagg3r

Odpowiedz

6

Można użyć loc zrobić swap:

df.loc[df['Col3'].isnull(), ['Col2', 'Col3']] = df.loc[df['Col3'].isnull(), ['Col3', 'Col2']].values 

Zauważ, że .values wymagane jest, aby upewnić zamiana jest wykonana prawidłowo, w przeciwnym razie Panda spróbuje dopasować na podstawie nazw indeksów i kolumn oraz bez zamiany w mógłby wystąpić.

Można też po prostu przypisać każdy wiersz indywidualnie, jeśli czujesz, że kod jest czystsze:

null_idx = df['Col3'].isnull() 
df.loc[null_idx, 'Col3'] = df['Col2'] 
df.loc[null_idx, 'Col2'] = np.nan 

Wynikiem:

Col1 Col2 Col3 
0 A NaN 7.0 
1 B NaN 16.0 
2 B 16.0 15.0 
+0

Awesome. Musisz przeczytać więcej o 'loc'. – dagg3r

3

Spróbuj tego: (jej szybciej)

df["Col3"], df["Col2"] = np.where(df['Col3'].isnull(), [df["Col2"], df["Col3"]], [df["Col3"], df["Col2"] ]) 
df 

    Col1 Col2 Col3 
0 A NaN 7.0 
1 B NaN 16.0 
1 B 16.0 15.0 


    %timeit df.loc[df['Col3'].isnull(), ['Col2', 'Col3']] = df.loc[df['Col3'].isnull(), ['Col3', 'Col2']].values 
100 loops, best of 3: 2.68 ms per loop 


    %timeit df["Col3"], df["Col2"] = np.where(df['Col3'].isnull(), [df["Col2"], df["Col3"]], [df["Col3"], df["Col2"] ]) 
1000 loops, best of 3: 592 µs per loop 
+0

Dziękuję Merlin. Masz pomysł, dlaczego to podejście jest szybsze niż inne? – dagg3r

+0

Wiem, zastanawiałem się, co powoduje przyspieszenie. A także podniosłem twoją odpowiedź. – dagg3r

+0

Co powinieneś zapytać, dlaczego jest powolny. – Merlin

Powiązane problemy