2017-02-20 3 views
1

Ich habe folgende Pandas Datenrahmen:Wie ersetzt man nur einzelne Zahlen durch eine andere Zahl in einem Pandas-Dataframe?

date 
0 1 
1 2 
2 23 
3 31 
4 4 
... 
n 3 

Wie kann ich nur alle Zahlen von 1 bis 9 (zB Zahlen mit einer Ziffer) mit folgendem Format ersetzen:

01, 02, 03, 04, 05, 06, 07, 08, 09 

Ich habe versucht, mit Pandas ersetzen Funktion die folgenden zu tun:

df['date'] = df['date'].replace(['1', '2', '3', '4', '5', '6', '7', '8', '9']), 
                  [' 01 ', ' 02 ', ' 03 ', '04 ', ' 05 ', ' 06 ', ' 07 ', ' 08 ', ' 09 '],regex=True) 

Es hat jedoch nicht funktioniert, weil es alle (d. H. Zahlen mit mehr als einer Ziffer) die Zahlen innerhalb des Datenrahmens. Wie kann ich also die Datumsspalte normalisieren?

Antwort

3

Bei Bedarf werfen die Säule zu strastype(str) verwenden, dann rufen str.zfill-0 Pad diesen Zahlen:

In [13]: 
df['date'] = df['date'].astype(str).str.zfill(2) 
df 

Out[13]: 
    date 
0 01 
1 02 
2 23 
3 31 
4 04 

in Bezug auf Ihre Bemerkung:

In [17]: 
df['year'] = '20' + df['date'] 
df 

Out[17]: 
    date year 
0 01 2001 
1 02 2002 
2 23 2023 
3 31 2031 
4 04 2004 

den oben genannten Arbeiten, wenn die Säule dtype bereits str

+0

Danke, ich wusste nicht, dass das möglich ist ... diese Lösung ist in Ordnung. Aber was ist, wenn ich das gleiche Problem seit Jahren habe? Betrachten Sie zum Beispiel eine Spalte Jahre mit 23, 12, 15 usw. Dann muss ich 20 auf der linken Seite der Ziffer imputieren ... Wie kann ich das tun ?. – tumbleweed

+0

Wenn schon ein str, dann kannst du einfach '' 20 '+ df [' year ']' oder '' 20 '+ df [' year ']. Astype (str) ' – EdChum

+0

Kannst du das Beispiel liefern? ... Danke für die Hilfe! – tumbleweed

1

Versuchen ^([0-9])$ für das Muster und 0\1 für den Ersatz:

>>> df = p.DataFrame(data={'date': ['1', '2', '12', '31']}) 
>>> df['date'].replace('^([0-9])$', r'0\1', regex=True) 

0 01 
1 02 
2 12 
3 31 
Name: date, dtype: object 

die Kommentare lesen, die Sie auf andere Fragen geschrieben, es scheint, wie Sie Datumsformatierung tun. Ich glaube, es ist besser, dafür datetime zu verwenden. Hier ein Beispiel:

>>> from datetime import datetime 
>>> df = p.DataFrame(data={'date': ['1', '2', '12', '31'], 'month': ['1', '2', '5', '12'], 'year': ['07', '10', '16', '17']}) 
>>> dates = df.apply(lambda row: datetime(year=2000+int(row['year']), month=int(row['month']), day=int(row['date'])), axis=1) 
>>> dates 

0 2007-01-01 
1 2010-02-02 
2 2016-05-12 
3 2017-12-31 
dtype: datetime64[ns] 
>>> dates.apply(lambda row: row.strftime('%x')) 

0 01/01/07 
1 02/02/10 
2 05/12/16 
3 12/31/17 
dtype: object 
>>> dates.apply(lambda row: row.strftime('%Y-%m-%d')) 

0 2007-01-01 
1 2010-02-02 
2 2016-05-12 
3 2017-12-31 
dtype: object 

Auf diese Weise erhalten Sie eine bessere Kontrolle über das Datumsformat.

bearbeiten

Wenn Sie noch mehr Kontrolle über die Konvertierung benötigen, eine Funktion stattdessen machen:

>>> def convert_dates(row): 
...  year = row['year'] 
...  month = row['month'] 
...  day = row['date'] 
...  if '' in [year, month, day]: 
...   return None # Don't bother with empty values 
...  year, month, day = [int(x) for x in [year, month, day]] 
...  if year < 100: 
...   year += 2000 
...  return datetime(year, month, day) 
... 
>>> df = p.DataFrame(data={'date': ['11', '2', '1', '31'], 'month': ['08', '2', '5', '12'], 'year': ['1985', '10', '16', '']}) 
>>> df.apply(convert_dates, axis=1) 

0 1985-08-11 
1 2010-02-02 
2 2016-05-01 
3   NaT 
dtype: datetime64[ns] 
+0

in einem Pandas Datenrahmen ?. – tumbleweed

+1

Ja, wie Ihr Code, aber mit einem anderen Muster. Ich habe ein Beispiel hinzugefügt. –

+0

Ich aktualisierte diese Antwort mit der Verwendung von 'apply', um stattdessen ein tatsächliches' datetime' Objekt zur einfacheren Formatierung zu erstellen. –

1

Verwenden Wortgrenzen:

Suche: \b(\d)\b
ersetzen: 0$1

1

Verwenden ein Regex, etwas wie

p = re.compile(r'\b\d\b') 
p.sub(lambda x: '0'+x.group(), '0 1 2 23 34 5') 
## result: '00 01 02 23 34 05' 
Verwandte Themen