Chciałbym dołączyć ciąg na początku każdej wartości we wspomnianej kolumnie ramki danych pandy (elegancko). Dowiedziałem się już, jak to zrobić i obecnie używam:
df.ix[(df['col'] != False), 'col'] = 'str'+df[(df['col'] != False), 'col']
Wydaje się to cholernie nieeleganckie - czy znasz inny sposób (który może również dodaje znak do wierszy, w których ta kolumna ma wartość 0 lub NaN)?
W przypadku, gdy nie jest to jeszcze jasne, chciałbym zwrócić się:
col
1 a
2 0
w:
col
1 stra
2 str0
!= False
firmą? Chcesz dodaćstr
każdą wartość, czy tylko część?df['col'] = 'str' + df['col'].astype(str)
?Odpowiedzi:
Przykład:
źródło
Alternatywnie możesz również użyć
apply
kombinacji zformat
(lub lepiej z f-stringami), co uważam za nieco bardziej czytelne, jeśli np. Chcesz również dodać sufiks lub manipulować samym elementem:co również daje pożądaną wydajność:
Jeśli używasz Pythona 3.6+, możesz także użyć f-strings:
dające ten sam wynik.
Wersja f-string jest prawie tak szybka, jak rozwiązanie @ RomanPekar (python 3.6.4):
Używanie jest
format
jednak znacznie wolniejsze:źródło
format
rzeczywiście działa gorzej. Jak wypadłeś?.apply
jest zawsze albo tak szybka, albo wolniejsza niż "bezpośrednie" operacje wektoryzowane; nawet jeśli nie są wolniejsze, wolę ich unikać w miarę możliwości.x
sobą itd., Ale to tylko kwestia gustu ... :)Możesz użyć pandy.Series.map:
Zastosuje słowo „str” przed wszystkimi wartościami.
źródło
Jeśli załadujesz plik tabeli
dtype=str
lub przekonwertujesz typ kolumny na łańcuch
df['a'] = df['a'].astype(str)
, możesz użyć takiego podejścia:
Takie podejście umożliwia dołączanie, dołączanie i podzbiór ciągu
df
.Działa na Pandas v0.23.4, v0.24.1. Nie wiem o wcześniejszych wersjach.
źródło
Inne rozwiązanie z .loc:
Nie jest to tak szybkie jak powyższe rozwiązania (> 1 ms wolniej na pętlę), ale może być przydatne w przypadku konieczności zmiany warunkowej, na przykład:
źródło
.index
wdf[mask].index
?df.loc[mask]
działa i działa, to.index
jest zbędne, prawda?