2016-11-06 4 views
1

einfach in Python bekommen, hoffentlich bin ich nicht eine dumme Frage hier fragen ...Wie Erstellen einen neuen Datenrahmen zu schaffen, basierend auf Bedingungen von einem anderen Datenrahmen

So habe ich einen Pandas Datenrahmen genannt „df_complete‘ sagen wir 100 Zeilen und enthalten Spalten mit den Namen: "type", "writer", "status", "col a", "col c". Ich möchte einen neuen Datenrahmen namens "temp_df" erstellen und aktualisieren . über die Bedingungen "df_complete" Werte

temp_df = pandas.DataFrame() 

if ((df_complete['type'] == 'NDD') & (df_complete['writer'] == 'Mary') & (df_complete['status'] != '7')): 
    temp_df['col A'] = df_complete['col a'] 
    temp_df['col B'] = 'good' 
    temp_df['col C'] = df_complete['col c'] 

jedoch verwenden, wenn ich das tue, habe ich die folgende Fehlermeldung:

las ich diesen Thread und änderte mein „und“ zu „&“: Truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

ich diesen Thread hier lesen alles in Klammern zu setzen: comparing dtyped [float64] array with a scalar of type [bool] in Pandas DataFrame

Aber der Fehler ist immer noch vorhanden. Was verursacht das? und wie kann ich es reparieren?

** Follow-up-Frage ** Wie kann ich auch die Indexwerte der Zeilen erhalten, die die Bedingung erfüllt?

+0

Das Problem ist, dass Sie Ihren großen boolean Ausdruck setzen, die in einem boolean-Ergebnisse - bewertete Serie in einer 'if'-Bedingung, die, wie der Fehler sagt, einen Wahrheitswert hat, der mehrdeutig ist. Können Sie in Worten genau sagen, was dieser 'if' Block erreichen soll? –

Antwort

2

Ich glaube, Sie brauchen boolean indexing mit ix zur Auswahl nur Spalten col a und col c:

temp_df = df_complete.ix[(df_complete['type'] == 'NDD') & 
         (df_complete['writer'] == 'Mary') & 
         (df_complete['status'] != '7'), ['col a','col c']] 
#rename columns 
temp_df = temp_df.rename(columns={'col a':'col A','col c':'col C'}) 
#add new column 
temp_df['col B'] = 'good' 
#reorder columns 
temp_df = temp_df[['col A','col B','col C']] 

Probe:

df_complete = pd.DataFrame({'type': ['NDD','NDD','NT'], 
          'writer':['Mary','Mary','John'], 
          'status':['4','5','6'], 
          'col a': [1,3,5], 
          'col b': [5,3,6], 
          'col c': [7,4,3]}, index=[3,4,5]) 

print (df_complete) 
    col a col b col c status type writer 
3  1  5  7  4 NDD Mary 
4  3  3  4  5 NDD Mary 
5  5  6  3  6 NT John 

temp_df = df_complete.ix[(df_complete['type'] == 'NDD') & 
         (df_complete['writer'] == 'Mary') & 
         (df_complete['status'] != '7'), ['col a','col c']] 

print (temp_df) 
    col a col c 
3  1  7 
4  3  4 

temp_df = temp_df.rename(columns={'col a':'col A','col c':'col C'}) 
#add new column 
temp_df['col B'] = 'good' 
#reorder columns 
temp_df = temp_df[['col A','col B','col C']] 
print (temp_df) 
    col A col B col C 
3  1 good  7 
4  3 good  4 
+0

Was ist 'df' hier? 'df_complete', vielleicht? –

+0

oops, typo es ist danke. – jezrael

+0

Hallo @jezrael vielen Dank für die ausführliche Erklärung! Kann ich eine Folgefrage stellen, wie man die Indexwerte der Zeilen erhält, die die Bedingung erfüllt haben? – alwaysaskingquestions

Verwandte Themen