Mam ramkę danych 20 x 4000 w Pythonie, używając pand. Dwie z tych kolumn są nazwane Year
i quarter
. Chciałbym utworzyć zmienną o nazwie period
make Year = 2000
i quarter= q2
into 2000q2
.
Czy ktoś może w tym pomóc?
jeśli obie kolumny są łańcuchami, możesz je bezpośrednio łączyć:
df["period"] = df["Year"] + df["quarter"]
Jeśli jedna (lub obie) kolumny nie są napisane ciągiem, należy je najpierw przekonwertować,
df["period"] = df["Year"].astype(str) + df["quarter"]
Jeśli chcesz dołączyć wiele kolumn ciągów, możesz użyć agg
:
df['period'] = df[['Year', 'quarter', ...]].agg('-'.join, axis=1)
Gdzie „-” jest separatorem.
add(dataframe.iloc[:, 0:10])
na przykład?sum
.dataframe["period"] = dataframe["Year"].map(str) + dataframe["quarter"].map(str)
map, to po prostu stosuje konwersję ciągów do wszystkich wpisów.Uzyskuje tę ramkę danych
Ta metoda uogólnia na dowolną liczbę kolumn łańcuchowych, zastępując
df[['Year', 'quarter']]
dowolnym wycinkiem kolumny ramki danych, npdf.iloc[:,0:2].apply(lambda x: ''.join(x), axis=1)
.Możesz sprawdzić więcej informacji na temat metody Apply () tutaj
źródło
lambda x: ''.join(x)
jest tylko''.join
nie?lambda x: ''.join(x)
konstrukcji lambda nic nie robi; to jak używanielambda x: sum(x)
zamiast po prostusum
.''.join
, tjdf['period'] = df[['Year', 'quarter']].apply(''.join, axis=1)
. :join
przyjmuje tylkostr
wystąpienia iterowalne . Użyj a,map
aby przekonwertować je wszystkie,str
a następnie użyjjoin
.Małe zestawy danych (<150 rzędów)
lub nieco wolniej, ale bardziej kompaktowo:
Większe zestawy danych (> 150 rzędów)
AKTUALIZACJA: Wykres czasowy Pandas 0.23.4
Przetestujmy to na 200 000 wierszy DF:
AKTUALIZACJA: nowe czasy przy użyciu Pandas 0.19.0
Czas bez optymalizacji CPU / GPU (posortowane od najszybszego do najwolniejszego):
Czas przy użyciu optymalizacji procesora / GPU:
Odpowiedz wkład od @ anton-vbr
źródło
df.T.apply(lambda x: x.str.cat(sep=''))
Sposób
cat()
na.str
akcesor działa bardzo dobrze na to:cat()
pozwala nawet dodać separator, więc na przykład załóżmy, że masz tylko liczby całkowite dla roku i okresu, możesz to zrobić:Łączenie wielu kolumn to tylko kwestia przekazania listy serii lub ramki danych zawierającej wszystkie oprócz pierwszej kolumny jako parametr do
str.cat()
wywołania w pierwszej kolumnie (serii):Zauważ, że jeśli twoja ramka danych / serii pand ma wartości zerowe, musisz dołączyć parametr na_rep, aby zastąpić wartości NaN ciągiem, w przeciwnym razie połączona kolumna będzie domyślnie ustawiona na NaN.
źródło
lambda
lubmap
; również czyta to najczystiej.str.cat()
. Zmienię odpowiedźsep
słowo kluczowe? w pandach-0.23.4. Dzięki!sep
parametr jest konieczny tylko wtedy, gdy zamierzasz oddzielić części połączonego łańcucha. Jeśli pojawi się błąd, pokaż nam swój nieudany przykład.Tym razem użycie funkcji lamba z string.format ().
Pozwala to na pracę z nie-ciągami i formatowanie wartości w razie potrzeby.
źródło
źródło
Year
nie jest łańcuchemdf['Year'].astype(str) + '' + df['quarter'].astype(str)
Chociaż odpowiedź @silvado jest dobre, jeśli zmieni
df.map(str)
siędf.astype(str)
to będzie szybciej:źródło
Załóżmy swoje
dataframe
ISdf
z kolumnamiYear
iQuarter
.Załóżmy, że chcemy zobaczyć ramkę danych;
Na koniec połącz
Year
iQuarter
następujące elementy.Teraz możesz
print
df
zobaczyć wynikową ramkę danych.Jeśli nie chcesz odstępu między rokiem a kwartałem, po prostu usuń go, wykonując tę czynność;
źródło
df['Period'] = df['Year'].map(str) + df['Quarter'].map(str)
TypeError: Series cannot perform the operation +
kiedy biegnę albodf2['filename'] = df2['job_number'] + '.' + df2['task_number']
albodf2['filename'] = df2['job_number'].map(str) + '.' + df2['task_number'].map(str)
.df2['filename'] = df2['job_number'].astype(str) + '.' + df2['task_number'].astype(str)
działało.dataframe
który utworzyłem powyżej, zobaczysz, że wszystkie kolumny sąstring
s.Oto implementacja, którą uważam za bardzo wszechstronną:
źródło
Ponieważ dane są wstawiane do ramki danych, to polecenie powinno rozwiązać problem:
źródło
bardziej wydajny jest
a oto próba czasowa:
końcowy, gdy
sum
użyje się (concat_df_str2), wynik nie jest po prostu concat, przejdzie do liczby całkowitej.źródło
df.values[:, 0:3]
Lubdf.values[:, [0,2]]
.uogólniając na wiele kolumn, dlaczego nie:
źródło
Korzystanie
zip
może być jeszcze szybsze:Wykres:
źródło
Najprostsze rozwiązanie:
Ogólne rozwiązanie
Pytanie specyficzne rozwiązanie
źródło
W tym rozwiązaniu zastosowano etap pośredni kompresujący dwie kolumny DataFrame do pojedynczej kolumny zawierającej listę wartości. Działa to nie tylko dla ciągów, ale dla wszystkich rodzajów typów kolumn
Wynik:
źródło
Jak wielu wspomniało wcześniej, należy przekonwertować każdą kolumnę na ciąg, a następnie użyć operatora plus, aby połączyć dwie kolumny ciągów. Możesz uzyskać dużą poprawę wydajności, używając NumPy.
źródło
df2['filename'] = df2['job_number'].values.astype(str) + '.' + df2['task_number'].values.astype(str)
-> Output :TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U21') dtype('<U21') dtype('<U21')
. Zarówno numer_zadania, jak i numer_zadania są liczbami całkowitymi.df['Year'].values.astype(str) + df.quarter
Myślę, że najlepszym sposobem na połączenie kolumn w pandy jest konwersja obu kolumn na liczby całkowite, a następnie na str.
źródło
Oto moje podsumowanie powyższych rozwiązań, aby połączyć / połączyć dwie kolumny z wartościami int i str w nową kolumnę, używając separatora między wartościami kolumn. W tym celu działają trzy rozwiązania.
źródło
Zastosowanie
.combine_first
.źródło
.combine_first
spowoduje'Year'
zapisanie wartości w'Period'
, lub, jeśli jest Null, wartość z'Quarter'
. Nie połączy dwóch łańcuchów i nie zapisze ich w'Period'
.Na przykład:
źródło
Można użyć metody przypisania DataFrame :
źródło
lub jeśli wartości są takie jak [2000] [4] i chcesz zrobić [2000q4]
podstawiając
.astype(str)
z.map(str)
prac zbyt.źródło