2017-07-09 6 views
1

Mein Code schabt Informationen von der Website und legt sie in einen Datenrahmen. Aber ich bin nicht sicher, warum die Reihenfolge des Codes zu dem Fehler führen wird: AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandasstr Fehler beim Ersetzen von Werten in Pandas Datenrahmen

Grundsätzlich haben die Daten gekratzt hat über 20 Zeilen und 10 Spalten.

  • Einige Werte sind in Klammern ie: (2,333) und ich möchte es ändern: -2333.
  • Einige Werte haben Worte n.a und ich möchte es numpy.nan
  • einige Werte - ändern und ich möchte auch sie numpy.nan ändern.

funktioniert nicht

for final_df, engine_name in zip((df_foo, df_bar, df_far), (['engine_foo', 'engine_bar', 'engine_far'])): 

# Replacing necessary items for final clean up 

    final_df.replace('-', numpy.nan, inplace=True) 
    final_df.replace('n.a.', numpy.nan, inplace=True) 

    for i in final_df.columns: 
     final_df[i] = final_df[i].str.replace(')', '') 
     final_df[i] = final_df[i].str.replace(',', '') 
     final_df[i] = final_df[i].str.replace('(', '-') 

    # Appending Code to dataframe 
    final_df = final_df.T 
    final_df.insert(loc=0, column='Code', value=some_code) 

# This produces the error - AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas 

Works

for final_df, engine_name in zip((df_foo, df_bar, df_far), (['engine_foo', 'engine_bar', 'engine_far'])): 

# Replacing necessary items for final clean up 

    for i in final_df.columns: 
     final_df[i] = final_df[i].str.replace(')', '') 
     final_df[i] = final_df[i].str.replace(',', '') 
     final_df[i] = final_df[i].str.replace('(', '-') 

    final_df.replace('-', numpy.nan, inplace=True) 
    final_df.replace('n.a.', numpy.nan, inplace=True) 

    # Appending Code to dataframe 
    final_df = final_df.T 
    final_df.insert(loc=0, column='Code', value=some_code) 

# This doesn't give me any errors and returns me what I want. 

Irgendwelche Gedanken darüber, warum dies geschieht?

+0

dies nicht reproduzierbar mit jedem Datenrahmen ist, könnten Sie ein Datum Beispiel geben? – PRMoureu

Antwort

1

Für mich arbeitet doppelt replace - zuerst mit regex=True für Substrings und zweite für alle Werte ersetzen:

np.random.seed(23) 
df = pd.DataFrame(np.random.choice(['(2,333)','n.a.','-',2.34], size=(3,3)), 
        columns=list('ABC')) 
print (df) 
     A  B  C 
0 2.34  - (2,333) 
1 n.a.  - (2,333) 
2 2.34 n.a. (2,333) 

df1 = df.replace(['\(','\)','\,'], ['-','',''], regex=True).replace(['-','n.a.'], np.nan) 
print(df1) 
     A B  C 
0 2.34 NaN -2333 
1 NaN NaN -2333 
2 2.34 NaN -2333 

df1 = df.replace(['-','n.a.'], np.nan).replace(['\(','\)','\,'], ['-','',''], regex=True) 
print(df1) 
     A B  C 
0 2.34 NaN -2333 
1 NaN NaN -2333 
2 2.34 NaN -2333 

EDIT:

Ihre Fehler bedeutet, dass Sie einige nicht String-Spalte ersetzt werden soll (zB alle Spalten NaN s in Spalte B) durch str.replace:

df1 = df.apply(lambda x: x.str.replace('\(','-').str.replace('\)','') 
          .str.replace(',','')).replace(['-','n.a.'], np.nan) 
print(df1) 
     A B  C 
0 2.34 NaN -2333 
1 NaN NaN -2333 
2 2.34 NaN -2333 

df1 = df.replace(['-','n.a.'], np.nan) 
     .apply(lambda x: x.str.replace('\(','-') 
         .str.replace('\)','') 
         .str.replace(',','')) 
print(df1) 

AttributeError: ('Can only use .str accessor with string values, which use np.object_ dtype in pandas', 'occurred at index B')

dtype der Spalte B ist float64:

df1 = df.replace(['-','n.a.'], np.nan) 
print(df1) 
     A B  C 
0 2.34 NaN (2,333) 
1 NaN NaN (2,333) 
2 2.34 NaN (2,333) 

print (df1.dtypes) 
A  object 
B float64 
C  object 
dtype: object 
Verwandte Themen