Ich habe einen 20 x 4000 Datenrahmen in Python mit Pandas. Zwei dieser Spalten heißen Year
und quarter
. Ich möchte eine Variable namens erstellenperiod
make Year = 2000
und quarter= q2
into2000q2
.
Kann mir jemand dabei helfen?
Wenn beide Spalten Zeichenfolgen sind, können Sie sie direkt verketten:
df["period"] = df["Year"] + df["quarter"]
Wenn eine (oder beide) der Spalten nicht vom Typ Zeichenfolge sind, sollten Sie sie zuerst konvertieren.
df["period"] = df["Year"].astype(str) + df["quarter"]
Wenn Sie mehrere Zeichenfolgenspalten verbinden müssen, können Sie Folgendes verwenden agg
:
df['period'] = df[['Year', 'quarter', ...]].agg('-'.join, axis=1)
Wobei "-" das Trennzeichen ist.
add(dataframe.iloc[:, 0:10])
zum Beispiel?sum
.dataframe["period"] = dataframe["Year"].map(str) + dataframe["quarter"].map(str)
Zuordnung nur eine Zeichenfolgenkonvertierung auf alle Einträge anwenden.Ergibt diesen Datenrahmen
Diese Methode wird auf eine beliebige Anzahl von Zeichenfolgenspalten verallgemeinert, indem sie
df[['Year', 'quarter']]
durch einen beliebigen Spaltenabschnitt Ihres Datenrahmens ersetzt wird, zdf.iloc[:,0:2].apply(lambda x: ''.join(x), axis=1)
.Weitere Informationen zur Methode apply () finden Sie hier
quelle
lambda x: ''.join(x)
ist nur''.join
nein?lambda x: ''.join(x)
Konstruktion nichts tut; Es ist wie mitlambda x: sum(x)
statt nur zu verwendensum
.''.join
, dh :df['period'] = df[['Year', 'quarter']].apply(''.join, axis=1)
.join
nurstr
Instanzen in einer Iterable. Verwenden Sie amap
, um sie alle in zu konvertierenstr
und dann zu verwendenjoin
.Kleine Datensätze (<150 Zeilen)
oder etwas langsamer aber kompakter:
Größere Datensätze (> 150 Zeilen)
UPDATE: Zeitdiagramm Pandas 0.23.4
Testen wir es in 200K Zeilen DF:
UPDATE: Neue Timings mit Pandas 0.19.0
Timing ohne CPU / GPU-Optimierung (sortiert vom schnellsten zum langsamsten):
Timing mit CPU / GPU-Optimierung:
Antwortbeitrag von @ anton-vbr
quelle
df.T.apply(lambda x: x.str.cat(sep=''))
Die Methode
cat()
des.str
Accessors funktioniert hierfür sehr gut:cat()
Sie können sogar ein Trennzeichen hinzufügen, sodass Sie beispielsweise Folgendes annehmen können, wenn Sie beispielsweise nur Ganzzahlen für Jahr und Zeitraum haben:Das Verbinden mehrerer Spalten besteht lediglich darin, entweder eine Liste von Serien oder einen Datenrahmen zu übergeben, der alle bis auf die erste Spalte als Parameter enthält,
str.cat()
der in der ersten Spalte (Serie) aufgerufen werden soll:Beachten Sie, dass Sie, wenn Ihr Pandas-Datenrahmen / Ihre Pandas-Serie Nullwerte enthält, den Parameter na_rep einschließen müssen, um die NaN-Werte durch eine Zeichenfolge zu ersetzen. Andernfalls wird in der kombinierten Spalte standardmäßig NaN verwendet.
quelle
lambda
odermap
; auch liest es nur am saubersten.str.cat()
. Ich werde die Antwort ändernsep
Schlüsselwort angeben ? in pandas-0.23.4. Vielen Dank!sep
Parameter ist nur erforderlich, wenn Sie die Teile der verketteten Zeichenfolge trennen möchten. Wenn Sie eine Fehlermeldung erhalten, zeigen Sie uns bitte Ihr fehlerhaftes Beispiel.Verwendung einer Lamba-Funktion dieses Mal mit string.format ().
Auf diese Weise können Sie nach Bedarf mit Nicht-Zeichenfolgen arbeiten und Werte neu formatieren.
quelle
quelle
Year
es sich nicht um einen String handeltdf['Year'].astype(str) + '' + df['quarter'].astype(str)
Obwohl die @ silvado-Antwort gut ist, wenn Sie
df.map(str)
zu ihr wechseln ,df.astype(str)
wird sie schneller sein:quelle
Nehmen wir an, Sie
dataframe
sinddf
mit SpaltenYear
undQuarter
.Angenommen, wir möchten den Datenrahmen sehen.
Zum Schluss verketten Sie das
Year
und dasQuarter
wie folgt.Sie können jetzt
print
df
den resultierenden Datenrahmen sehen.Wenn Sie den Abstand zwischen Jahr und Quartal nicht möchten, entfernen Sie ihn einfach, indem Sie dies tun.
quelle
df['Period'] = df['Year'].map(str) + df['Quarter'].map(str)
TypeError: Series cannot perform the operation +
wenn ich entwederdf2['filename'] = df2['job_number'] + '.' + df2['task_number']
oder rennedf2['filename'] = df2['job_number'].map(str) + '.' + df2['task_number'].map(str)
.df2['filename'] = df2['job_number'].astype(str) + '.' + df2['task_number'].astype(str)
aber funktioniert.dataframe
, das ich oben erstellt habe, werden Sie sehen, dass alle Spaltenstring
s sind.Hier ist eine Implementierung, die ich sehr vielseitig finde:
quelle
Wenn Ihre Daten in einen Datenrahmen eingefügt werden, sollte dieser Befehl Ihr Problem lösen:
quelle
effizienter ist
und hier ist ein Zeittest:
Wenn
sum
(concat_df_str2) verwendet wird, ist das Ergebnis nicht einfach concat, sondern wird in eine Ganzzahl umgewandelt.quelle
df.values[:, 0:3]
oderdf.values[:, [0,2]]
.Verallgemeinern auf mehrere Spalten, warum nicht:
quelle
Die Verwendung
zip
könnte noch schneller sein:Graph:
quelle
Einfachste Lösung:
Generische Lösung
Fragenspezifische Lösung
quelle
Diese Lösung verwendet einen Zwischenschritt, bei dem zwei Spalten des DataFrame zu einer einzelnen Spalte komprimiert werden, die eine Liste der Werte enthält. Dies funktioniert nicht nur für Zeichenfolgen, sondern für alle Arten von Spalten-d-Typen
Ergebnis:
quelle
Wie bereits erwähnt, müssen Sie jede Spalte in eine Zeichenfolge konvertieren und dann mit dem Plus-Operator zwei Zeichenfolgenspalten kombinieren. Mit NumPy können Sie eine große Leistungsverbesserung erzielen.
quelle
df2['filename'] = df2['job_number'].values.astype(str) + '.' + df2['task_number'].values.astype(str)
-> Ausgabe :TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U21') dtype('<U21') dtype('<U21')
. Sowohl job_number als auch task_number sind Ints.df['Year'].values.astype(str) + df.quarter
Ich denke, der beste Weg, die Spalten in Pandas zu kombinieren, besteht darin, beide Spalten in Integer und dann in Str zu konvertieren.
quelle
Hier ist meine Zusammenfassung der obigen Lösungen zum Verketten / Kombinieren von zwei Spalten mit dem Wert int und str zu einer neuen Spalte unter Verwendung eines Trennzeichens zwischen den Werten der Spalten. Zu diesem Zweck arbeiten drei Lösungen.
quelle
Verwenden Sie
.combine_first
.quelle
.combine_first
führt dazu, dass entweder der Wert'Year'
in gespeichert'Period'
wird oder, wenn er Null ist, der Wert aus'Quarter'
. Die beiden Zeichenfolgen werden nicht verkettet und in gespeichert'Period'
.Zum Beispiel:
quelle
Man kann die Zuweisungsmethode von DataFrame verwenden :
quelle
oder wenn Werte wie [2000] [4] sind und [2000q4] machen wollen
.astype(str)
durch.map(str)
Werke ersetzen .quelle