Mam ramkę danych z jedną kolumną i chciałbym podzielić ją na dwie kolumny, z nagłówkiem jednej kolumny jako „fips'
a drugą”'row'
Moja ramka danych df
wygląda następująco:
row
0 00000 UNITED STATES
1 01000 ALABAMA
2 01001 Autauga County, AL
3 01003 Baldwin County, AL
4 01005 Barbour County, AL
Nie wiem, jak użyć, df.row.str[:]
aby osiągnąć cel podziału komórki wiersza. Mogę użyć, df['fips'] = hello
aby dodać nową kolumnę i wypełnić ją hello
. Jakieś pomysły?
fips row
0 00000 UNITED STATES
1 01000 ALABAMA
2 01001 Autauga County, AL
3 01003 Baldwin County, AL
4 01005 Barbour County, AL
read_table()
lubread_fwf()
Odpowiedzi:
Może być lepszy sposób, ale oto jedno podejście:
źródło
index = df.index
i jesteś dobry.split
metoda zwraca NaN, atolist
metoda zwróci taką wartość, jaką jest (NaN), co spowodujeValueError
(w celu przezwyciężenia tego problemu można przerzucić ją na typ łańcucha przed podziałem). Polecam spróbować samemu, to najlepszy sposób nauki :-)df
marow
nagłówek kolumny? Możesz myśleć, że to jakiś atrybut DataFrame, ale jest całkiem jasne, że to nazwa kolumny. To od Ciebie zależy, jak utworzysz i zdefiniujesz nagłówki kolumn, więc jeśli używasz innego, użyj go (npdf.my_column_name.split(...)
.).Wersja TL; DR:
W prostym przypadku:
Najprostszym rozwiązaniem jest:
Możesz też utworzyć automatycznie DataFrame z jedną kolumną dla każdego wpisu podziału automatycznie za pomocą:
Musisz użyć,
expand=True
jeśli ciągi mają nierównomierną liczbę podziałów i chceszNone
zastąpić brakujące wartości.Zauważ, że w obu przypadkach
.tolist()
metoda nie jest konieczna. Ani też niezip()
.Szczegółowo:
Rozwiązanie Andy'ego Haydena jest najdoskonalsze w zademonstrowaniu siły
str.extract()
metody.Ale w przypadku zwykłego podziału na znany separator (np. Dzielenie za pomocą myślników lub dzielenie za pomocą białych znaków)
.str.split()
metoda wystarczy 1 . Działa na kolumnie (Seria) ciągów i zwraca kolumnę (Seria) list:1: Jeśli nie masz pewności, co robią pierwsze dwa parametry
.str.split()
, polecam dokumentację dla zwykłej wersji metody w języku Python .Ale jak to zrobić:
do:
Cóż, musimy przyjrzeć się bliżej
.str
atrybutowi kolumny.Jest to magiczny obiekt, który służy do zbierania metod, które traktują każdy element w kolumnie jako ciąg znaków, a następnie stosuje odpowiednią metodę w każdym elemencie tak wydajnie, jak to możliwe:
Ale ma również interfejs „indeksowania” do pobierania każdego elementu ciągu według jego indeksu:
Oczywiście ten interfejs indeksowania
.str
nie obchodzi, czy każdy indeksowany element jest w rzeczywistości łańcuchem, o ile można go indeksować, więc:Następnie jest to prosta kwestia skorzystania z rozpakowywania iterowych krotek w Pythonie
Oczywiście uzyskanie DataFrame z podziału kolumny ciągów jest tak przydatne, że
.str.split()
metoda może to zrobić za pomocąexpand=True
parametru:Kolejnym sposobem na osiągnięcie tego, co chcieliśmy, jest:
expand=True
Wersja, chociaż dłużej, ma wyraźną przewagę nad metodą krotki rozpakowaniu. Rozpakowywanie krotek nie radzi sobie dobrze z podziałami o różnych długościach:Ale
expand=True
radzi sobie z tym ładnie, umieszczającNone
w kolumnach, dla których nie ma wystarczającej liczby „podziałów”:źródło
.split()
metody wyjaśniającej dwa pierwsze parametry lepiej niż dokumenty Pandy.df.join(df['AB'].str.split('-', 1, expand=True).rename(columns={0:'A', 1:'B'}))
Możesz dokładnie wyodrębnić różne części za pomocą wzoru regularnego:
Aby wyjaśnić nieco długi regex:
\d
) i nazywa je"fips"
.Następna część:
Czy albo (
|
) jedna z dwóch rzeczy:*
) wielkich liter lub spacji ([A-Z ]
) i nazywa ją"state"
przed końcem ciągu ($
),lub
.*
)state_code
przed końcem ciągu ($
).W przykładzie:
Zauważ, że pierwsze dwa wiersze uderzyły w „stan” (pozostawiając NaN w kolumnie hrabstwa i state_code), podczas gdy trzy ostatnie uderzyły w hrabstwo, state_code (pozostawiając NaN w kolumnie stanu).
źródło
(?P<label>...)
składnię! Nie mam pojęcia, dlaczego wybrałem bardziej złożony regex, najwyraźniej prosty może działać hmmmm<group_name>
. Teraz wiem, że dzięki temu mój kod jest bardzo zwięzły.źródło
Jeśli nie chcesz tworzyć nowej ramki danych lub jeśli twoja rama danych ma więcej kolumn niż tylko te, które chcesz podzielić, możesz:
źródło
zip argument #1 must support iteration
błąd, python 2.7Można użyć
str.split
spacjami (domyślnie) i separatora parametrexpand=True
dlaDataFrame
z przypisać do nowych kolumn:W razie potrzeby zmień oryginalną kolumnę za pomocą
DataFrame.pop
Jak to jest:
Jeśli pojawi się błąd:
Możesz sprawdzić i zwraca 4 kolumny
DataFrame
, nie tylko 2:Następnie dodawane jest nowe rozwiązanie
DataFrame
przezjoin
:Z usuń oryginalną kolumnę (jeśli są jeszcze inne kolumny):
źródło
Jeśli chcesz podzielić ciąg na więcej niż dwie kolumny oparte na ograniczniku, możesz pominąć parametr „maksymalne podziały”.
Możesz użyć:
Spowoduje to automatyczne utworzenie tylu kolumn, ile wynosi maksymalna liczba pól zawartych w dowolnym z początkowych ciągów.
źródło
Zaskoczony, jeszcze go nie widziałem. Jeśli potrzebujesz tylko dwóch podziałów, bardzo polecam. . .
Series.str.partition
partition
wykonuje jeden podział na separatorze i ogólnie jest dość wydajny.Jeśli musisz zmienić nazwę wierszy,
Jeśli chcesz dołączyć to z powrotem do oryginału, użyj
join
lubconcat
:źródło
Wolę eksportu odpowiednią serią pandy (czyli kolumn muszę), stosując zastosować funkcję podzielić zawartość kolumny na wiele serii, a następnie dołączyć wygenerowane kolumny do istniejącego DataFrame. Oczywiście kolumna źródłowa powinna zostać usunięta.
na przykład
Aby podzielić dwa słowa, funkcja ciągów znaków powinna być taka:
źródło
Widziałem, że nikt nie zastosował metody wycinania, więc tutaj umieściłem tutaj moje 2 centy.
Ta metoda utworzy dwie nowe kolumny.
źródło
Użyj,
df.assign
aby utworzyć nowy plik df. Zobacz http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copyźródło