2016-12-18 12 views
0

Ich möchte leere Zellen mit dem vorherigen Zeilenwert füllen, wenn sie mit der Nummer beginnen. Zum Beispiel habe ichPandas (Python): Leere Zellen mit vorherigen Zeilenwerten füllen?

Text Text  
    30  Text Text  
      Text Text  
      Text Text  
    31  Text Text 
    Text Text  
    31  Text Text  
      Text Text  
      Text Text  
    32  Text Text 
    Text Text  
      Text Text  
      Text Text  
      Text Text  
      Text Text 

aber ich möchte haben

Text Text  
30  Text Text  
30  Text Text  
30  Text Text  
31  Text Text 
Text Text  
31  Text Text  
31  Text Text  
31  Text Text  
32  Text Text 
Text Text  
     Text Text  
     Text Text  
     Text Text  
     Text Text 

ich mit diesem Code, dies zu erreichen versucht:

data = pd.read_csv('DATA.csv',sep='\t', dtype=object, error_bad_lines=False) 
data = data.fillna(method='ffill', inplace=True) 
print(data) 

aber es hat nicht funktioniert.

Gibt es trotzdem etwas zu tun?

+0

Was die Werte der "leeren" Zellen sind? 'fillna' füllt nur Zellen, deren Wert' NaN' ist. Um "fillna" zu verwenden, ersetzen Sie zuerst "" durch "numpy.nan". – DyZ

+0

Danke. Ich habe "leere" Werte mit Regex in NaN geändert. Aber es hat nicht funktioniert. –

Antwort

1

Zuerst Ihre leeren Zellen mit NaNs ersetzen:

df[df[0]==""] = np.NaN 

Nun Verwenden ffill():

df.fillna(method='ffill') 
#  0 
#0 Text 
#1 30 
#2 30 
#3 30 
#4 31 
#5 Text 
#6 31 
#7 31 
#8 31 
#9 32 
+0

Funktioniert es mit String-Werten? Weil ich versuche, meine leeren Zellen mit dem vorherigen Zeilenwert zu füllen, der eine Zeichenfolge ist, und es gibt immer noch "NaN" zurück. – joasa

3

Ich glaube, Sie erste NaN statt whitespaces bekommen:

df.Text = df.Text[df.Text.str.strip() != ''] 

print (df) 
    Text Text.1  
0  30 Text Text 
1 NaN Text Text 
2 NaN Text Text 
3  31 Text Text 
4 Text Text NaN 
5  31 Text Text 
6 NaN Text Text 
7 NaN Text Text 
8  32 Text Text 
9 Text Text NaN 
10 NaN Text Text 
11 NaN Text Text 
12 NaN Text Text 
13 NaN Text Text 

Dann ffill (gleich wie fillna mit dem Parameter ffill) verwenden, to_numeric für where bekommen für NaN ersetzen, wenn nicht numerisch vorwärts NaN Füllung, zuletzt ersetzen NaN durch leeren String von fillna:

orig = df.Text.copy() 
df.Text = df.Text.ffill() 
mask1 = pd.to_numeric(df.Text, errors='coerce') 
df.Text = df.Text.where(mask1, orig).fillna('') 
print (df) 
    Text Text.1  
0  30 Text Text 
1  30 Text Text 
2  30 Text Text 
3  31 Text Text 
4 Text Text NaN 
5  31 Text Text 
6  31 Text Text 
7  31 Text Text 
8  32 Text Text 
9 Text Text NaN 
10   Text Text 
11   Text Text 
12   Text Text 
13   Text Text 
+0

vielen Dank. Jedoch, wenn ich Ihren Code ausführen ich diese: Linie 2672, in __getattr__ return Objekt .__ getAttribute __ (self, name) Attribute: 'Dataframe' Objekt hat kein Attribut 'Text' Ich konnte nicht verstehen, was .Text Mittel . (Ich schrieb Text, aber tatsächlich gibt es einige String-Werte). –

+0

Text ist der Spaltenname, verwenden Sie stattdessen 'df.col1' oder' df ['col 1'] ''. – jezrael

Verwandte Themen