Próbuję przeprogramować mój kod Stata na Python w celu zwiększenia szybkości i zostałem wskazany w kierunku PANDAS. Trudno mi jednak zrozumieć, jak przetwarzać dane.
Powiedzmy, że chcę iterować po wszystkich wartościach w nagłówku kolumny „ID”. Jeśli ten identyfikator pasuje do określonej liczby, chcę zmienić dwie odpowiadające mu wartości FirstName i LastName.
W Stata wygląda to tak:
replace FirstName = "Matt" if ID==103
replace LastName = "Jones" if ID==103
Więc to zastępuje wszystkie wartości w FirstName, które odpowiadają wartościom ID == 103 Matt.
W PANDAS próbuję czegoś takiego
df = read_csv("test.csv")
for i in df['ID']:
if i ==103:
...
Nie wiem, dokąd się stąd udać. Jakieś pomysły?
df.loc[df.ID == 103, ['FirstName', 'LastName']] = 'Matt', 'Jones'
Możesz użyć
map
, może mapować wartości z dyktatury, a nawet funkcję niestandardową.Załóżmy, że to jest twój plik df:
Utwórz dykty:
I mapa:
Rezultatem będzie:
Lub użyj funkcji niestandardowej:
źródło
dict
jest tworzony do mapowania. W przeciwnym razie można przeprowadzić pewne sprawdzenie / czyszczenie w oparciu o coś takiego:df.ID.isin(names.keys())
Oryginalne pytanie dotyczy konkretnego wąskiego przypadku użycia. Dla tych, którzy potrzebują bardziej ogólnych odpowiedzi, oto kilka przykładów:
Tworzenie nowej kolumny na podstawie danych z innych kolumn
Biorąc pod uwagę ramkę danych poniżej:
Poniżej dodajemy nową
description
kolumnę jako konkatenację innych kolumn za pomocą+
operacji, która jest nadpisywana dla serii. Fantazyjne formatowanie ciągów, f-stringi itp. Nie będą tutaj działać, ponieważ mają+
zastosowanie do skalarów, a nie wartości „pierwotnych”:Dostajemy
1 years
za kota (zamiast1 year
), który będziemy naprawiać poniżej za pomocą warunków.Modyfikowanie istniejącej kolumny za pomocą warunków
Tutaj zastępujemy oryginalną
animal
kolumnę wartościami z innych kolumn i używamynp.where
do ustawienia podciągu warunkowego na podstawie wartościage
:Modyfikowanie wielu kolumn za pomocą warunków
Bardziej elastycznym podejściem jest wywołanie
.apply()
całej ramki danych zamiast pojedynczej kolumny:W powyższym kodzie
transform_row(r)
funkcja przyjmujeSeries
obiekt reprezentujący dany wiersz (oznaczonyaxis=1
jako domyślna wartośćaxis=0
zapewniSeries
obiekt dla każdej kolumny). Upraszcza to przetwarzanie, ponieważ możemy uzyskać dostęp do rzeczywistych wartości „pierwotnych” w wierszu za pomocą nazw kolumn i mieć widoczność innych komórek w danym wierszu / kolumnie.źródło
np.where
prawdopodobnie jest to, czego szukasz, patrz np stackoverflow.com/a/42540310/191246 ale jest to również możliwe, że nie będzie w stanie dopasować do logiki działania skalarnym, to trzeba by jednoznacznie przekształcić komórka numerycznie podobna do tego, jak to się robitransform_row
To pytanie może być wciąż odwiedzane na tyle często, że warto zaproponować uzupełnienie odpowiedzi pana Kassiesa.
dict
Wbudowany w klasie może być sub-klasyfikowane tak, że domyślnie jest zwracana na klucze „brakujących”. Ten mechanizm działa dobrze w przypadku pand. Ale patrz poniżej.W ten sposób można uniknąć kluczowych błędów.
To samo można zrobić prościej w następujący sposób. Użycie argumentu „default” w
get
metodzie obiektu dict sprawia, że nie jest konieczne tworzenie podklasy dict.źródło