Ich habe eine CSV-Datei, die ich in einem Pandas DataFrame lesen, die eine Spalte mit mehreren Jahreswerte durch ein Semikolon getrennt enthält.Extrahieren Minimum und Maximum Jahr von Zeichenfolge in Pandas DataFrame
Ich muss den minimalen und maximalen Wert aus der Zeichenfolge extrahieren und jeweils in einer neuen Spalte speichern.
Ich bin in der Lage, das Minimum und Maximum zu drucken, aber ich kann nicht scheinen, die richtigen Werte von jeder Zeile zu erhalten, die in einer neuen Spalte gespeichert werden.
Jede Hilfe wird sehr geschätzt.
Beispieldatenrahmen:
import pandas as pd
import numpy as np
raw_data = {'id': ['1473-2262', '2327-9214', '1949-8349', '2375-6314',
'0095-6562'],
'years': ['2000; 2001; 2002; 2003; 2004; 2004; 2004; 2005',
'2003; 2004; 2005', '2015', np.nan, '2012; 2014']}
df = pd.DataFrame(raw_data, columns = ['id', 'years'])
Dies ist der Datenrahmen, was ich brauche:
id years minyear maxyear
0 1473-2262 2000; 2001; 2002; 2003; 2004; 2004; 2004; 2005 2000.0 2005.0
1 2327-9214 2003; 2004; 2005 2003.0 2005.0
2 1949-8349 2015 2015.0 2015.0
3 2375-6314 NaN NaN NaN
4 0095-6562 2012; 2014 2012.0 2014.0
ich das Minimum drucken kann und maximal:
x = df['years'].notnull()
for row in df['years'][x].str.split(pat=';'):
lst = list()
for item in row:
lst.append(int(item))
print('Min=',min(lst),'Max=',max(lst))
Min= 2000 Max= 2005
Min= 2003 Max= 2005
Min= 2015 Max= 2015
Min= 2012 Max= 2014
Hier ist, wie ich versucht habe, um die Werte zu neuen Spalten zu erfassen:
x = df['years'].notnull()
for row in df['years'][x].str.split(pat=';'):
lst = list()
for item in row:
lst.append(int(item))
df['minyear']=min(lst)
df['maxyear']=max(lst)
Nur die Werte aus der letzten Zeile werden in den neuen Spalten gespeichert.
id years minyear maxyear
0 1473-2262 2000; 2001; 2002; 2003; 2004; 2004; 2004; 2005 2012 2014
1 2327-9214 2003; 2004; 2005 2012 2014
2 1949-8349 2015 2012 2014
3 2375-6314 NaN 2012 2014
4 0095-6562 2012; 2014 2012 2014
Meine Lösung ist nur doppelt so langsam wie Ihre. Nicht so schlecht :) – DyZ
Nein, nur 5. Würde es nicht linear mit der Anzahl der Zeilen skalieren? – DyZ
@jezrael Sie haben Recht. Ich wundere mich warum. – DyZ