988 Stimmen

Kombinieren Sie zwei Textspalten im Pandas-Datenrahmen

Ich habe ein 20 x 4000 DataFrame in Python mit pandas. Zwei dieser Spalten sind mit Jahr und Quartal benannt. Ich würde gerne eine Variable namens period erstellen, die aus Jahr = 2000 und Quartal = q2 2000q2 macht.

Kann mir jemand dabei helfen?

1256voto

silvado Punkte 16172

Wenn beide Spalten Zeichenfolgen sind, können Sie sie direkt verknüpfen:

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"]

Vorsicht bei NaNs!


Wenn Sie mehrere Zeichenspalten verbinden müssen, können Sie agg verwenden:

df['period'] = df[['Year', 'quarter', ...]].agg('-'.join, axis=1)

Wo "-" der Trenner ist.

413voto

Kleine Datensätze (< 150 Zeilen)

[''.join(i) for i in zip(df["Year"].map(str),df["quarter"])]

oder etwas langsamer, aber kompakter:

df.Year.str.cat(df.quarter)

Größere Datensätze (> 150 Zeilen)

df['Year'].astype(str) + df['quarter']

UPDATE: Timing-Diagramm Pandas 0.23.4

enter image description here

Testen wir es anhand eines DF mit 200.000 Zeilen:

In [250]: df
Out[250]:
   Year quarter
0  2014      q1
1  2015      q2

In [251]: df = pd.concat([df] * 10**5)

In [252]: df.shape
Out[252]: (200000, 2)

UPDATE: Neue Zeitmessungen unter Verwendung von Pandas 0.19.0

Zeitmessung ohne CPU/GPU-Optimierung (sortiert von schnell bis langsam):

In [107]: %timeit df['Year'].astype(str) + df['quarter']
10 loops, best of 3: 131 ms per loop

In [106]: %timeit df['Year'].map(str) + df['quarter']
10 loops, best of 3: 161 ms per loop

In [108]: %timeit df.Year.str.cat(df.quarter)
10 loops, best of 3: 189 ms per loop

In [109]: %timeit df.loc[:, ['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 567 ms per loop

In [110]: %timeit df[['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 584 ms per loop

In [111]: %timeit df[['Year','quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1)
1 loop, best of 3: 24.7 s per loop

Zeitmessung unter Verwendung von CPU/GPU-Optimierung:

In [113]: %timeit df['Year'].astype(str) + df['quarter']
10 loops, best of 3: 53.3 ms per loop

In [114]: %timeit df['Year'].map(str) + df['quarter']
10 loops, best of 3: 65.5 ms per loop

In [115]: %timeit df.Year.str.cat(df.quarter)
10 loops, best of 3: 79.9 ms per loop

In [116]: %timeit df.loc[:, ['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 230 ms per loop

In [117]: %timeit df[['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 230 ms per loop

In [118]: %timeit df[['Year','quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1)
1 loop, best of 3: 9.38 s per loop

Antwortbeitrag von @anton-vbr

328voto

Russ Punkte 3536
df = pd.DataFrame({'Jahr': ['2014', '2015'], 'quartal': ['q1', 'q2']})
df['periode'] = df[['Jahr', 'quartal']].apply(lambda x: ''.join(x), axis=1)

Erzeugt dieses Datenframe

   Jahr quartal  periode
0  2014      q1  2014q1
1  2015      q2  2015q2

Diese Methode kann auf eine beliebige Anzahl von Spalten angewendet werden, indem df[['Jahr', 'quartal']] durch einen beliebigen Spaltenschnitt Ihres Datenframes ersetzt wird, z.B. df.iloc[:,0:2].apply(lambda x: ''.join(x), axis=1).

Weitere Informationen zur apply() Methode finden Sie hier

201voto

LeoRochael Punkte 12443

Die Methode cat() des .str Accessors funktioniert sehr gut für das hier:

>>> import pandas as pd
>>> df = pd.DataFrame([["2014", "q1"], 
...                    ["2015", "q3"]],
...                   columns=('Jahr', 'Quartal'))
>>> print(df)
   Jahr Quartal
0  2014      q1
1  2015      q3
>>> df['Zeitraum'] = df.Jahr.str.cat(df.Quartal)
>>> print(df)
   Jahr Quartal  Zeitraum
0  2014      q1    2014q1
1  2015      q3    2015q3

cat() erlaubt es sogar, einen Trennzeichen hinzuzufügen. Wenn beispielsweise nur Ganzzahlen für Jahr und Periode vorliegen, können Sie dies tun:

>>> import pandas as pd
>>> df = pd.DataFrame([[2014, 1],
...                    [2015, 3]],
...                   columns=('Jahr', 'Quartal'))
>>> print(df)
   Jahr Quartal
0  2014       1
1  2015       3
>>> df['Zeitraum'] = df.Jahr.astype(str).str.cat(df.Quartal.astype(str), sep='q')
>>> print(df)
   Jahr Quartal  Zeitraum
0  2014       1    2014q1
1  2015       3    2015q3

Mehrere Spalten zu verbinden ist nur eine Frage, entweder eine Liste von Serien oder ein DataFrame, das alle außer der ersten Spalte als Parameter an str.cat() übergeben wird, das auf der ersten Spalte (Serie) aufgerufen wird:

>>> df = pd.DataFrame(
...     [['USA', 'Nevada', 'Las Vegas'],
...      ['Brasilien', 'Pernambuco', 'Recife']],
...     columns=['Land', 'Staat', 'Stadt'],
... )
>>> df['AllesZusammen'] = df['Land'].str.cat(df[['Staat', 'Stadt']], sep=' - ')
>>> print(df)
       Land       Staat       Stadt                   AllesZusammen
0       USA      Nevada   Las Vegas      USA - Nevada - Las Vegas
1  Brasilien  Pernambuco      Recife  Brasilien - Pernambuco - Recife

Beachten Sie, dass wenn Ihr Pandas DataFrame/Serie Nullwerte hat, müssen Sie den Parameter na_rep einbeziehen, um die NaN-Werte durch einen String zu ersetzen, sonst wird die kombinierte Spalte standardmäßig zu NaN.

44voto

Bill Gale Punkte 1072

Verwendung einer Lamba-Funktion diesmal mit string.format().

import pandas as pd
df = pd.DataFrame({'Year': ['2014', '2015'], 'Quarter': ['q1', 'q2']})
print df
df['YearQuarter'] = df[['Year','Quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1)
print df

  Quarter  Year
0      q1  2014
1      q2  2015
  Quarter  Year YearQuarter
0      q1  2014      2014q1
1      q2  2015      2015q2

Dies ermöglicht es Ihnen, mit Nicht-Zeichenfolgen zu arbeiten und Werte bei Bedarf neu zu formatieren.

import pandas as pd
df = pd.DataFrame({'Year': ['2014', '2015'], 'Quarter': [1, 2]})
print df.dtypes
print df

df['YearQuarter'] = df[['Year','Quarter']].apply(lambda x : '{}q{}'.format(x[0],x[1]), axis=1)
print df

Quarter     int64
Year       object
dtype: object
   Quarter  Year
0        1  2014
1        2  2015
   Quarter  Year YearQuarter
0        1  2014      2014q1
1        2  2015      2015q2

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X