Da Sie eval()
verwenden, gehe ich davon aus jede Spalte eine Zeichenfolgendarstellung einer Liste und nicht eine Liste selbst. Im Gegensatz zu Ihrem obigen Beispiel gehe ich davon aus, dass um die Elemente in den Listen in Ihrer neighborhoods
Spalte (df.iloc[0, 'neighborhoods'] == "['asas','dfd']"
) Anführungszeichen stehen, da andernfalls Ihr eval() fehlschlagen würde.
Wenn das alles korrekt ist, könnten Sie so etwas wie dies versuchen:
def list2columns(df):
"""
to convert list in the columns of a dataframe
"""
columns = ['categories','neighborhoods']
new_cols = set() # list of all new columns added
for col in columns:
for i in range(len(df[col])):
# get the list of columns to set
set_cols = eval(df.iloc[i, col])
# set the values of these columns to 1 in the current row
# (if this causes new columns to be added, other rows will get nans)
df.iloc[i, set_cols] = 1
# remember which new columns have been added
new_cols.update(set_cols)
# convert any un-set values in the new columns to 0
df[list(new_cols)].fillna(value=0, inplace=True)
# if that doesn't work, this may:
# df.update(df[list(new_cols)].fillna(value=0))
ich nur auf eine Antwort auf Ihre zweite Frage, über die SettingWithCopy Warnung spekulieren kann.
Es ist möglich (aber unwahrscheinlich), dass df.iloc
statt df.loc
mit helfen, dass da durch die Zeilennummer wählen sollte (in Ihrem Fall df.loc[i, col]
funktioniert nur, weil Sie keinen Index gesetzt haben, so Pandas den Standard verwendet Index, der der Zeilennummer entspricht).
Eine andere Möglichkeit ist, dass die df
, die an Ihre Funktion übergeben wird, bereits ein Stück von einem größeren Dataframe ist, und das verursacht die Warnung SettingWithCopy.
Ich habe auch festgestellt, dass die Verwendung von df.loc
mit gemischten Indexierungsmodi (logische Selektoren für Zeilen und Spaltennamen für Spalten) die Warnung SettingWithCopy erzeugt; Es ist möglich, dass Ihre Slice Selectors ähnliche Probleme verursachen.
Hoffentlich löst die einfachere und direktere Indexierung im obigen Code jedes dieser Probleme. Aber melden Sie sich bitte zurück (und stellen Sie Code zur Verfügung, um df
zu generieren), wenn Sie diese Warnung immer noch sehen.