2017-11-16 3 views
0

Ich benutze Dictoinaries in Wörterbüchern. Beim Durchlaufen eines Pandas-Datenrahmens stimmt der Wert der Aktionszeile immer mit einem der Schlüssel im Wörterbuch überein, und basierend darauf werden einige andere Werte aus dieser Zeile an eine Liste in diesem Wörterbuch angehängt. Aus irgendeinem Grund jedoch werden die Werte in allen Listen in den anderen WörterbüchernPython hängt an allen Wörterbüchern an

general_form = { 
     "Percentage": np.nan, "DayPercentage": np.nan, "sample_size": np.nan, "Percentages": [], "DayPercentages": [] 
    } 
    #get all possible action types 
    action_types = self.df['Action Type'].tolist() 
    action_types = list(set(action_types)) 

    #give every action type its own dictionary within the main dictionary 
    sheetstats = {} 
    for action in action_types: 
     sheetstats[action] = general_form 

    #push the percentage in the list inside the dictionary specified in 
    #action 
    for index, row in self.df.iterrows(): 
     percentage = row['Percentage'] 
     daypercentage = row['DayPercentage'] 
     action = row['Action Type'] 
     sheetstats[action]['Percentages'].append(percentage) 
     sheetstats[action]["DayPercentages"].append(daypercentage) 
beigefügten

Dies wird alle Prozentangaben identisch in allen Wörterbüchern innerhalb sheetstats machen. Warum?

+0

Weil Sie das * gleiche Wörterbuch * verwenden: 'folgestats [action] = general_form'. –

+1

'folestats [action] = general_form' sagt, dass Sie das gleiche Wörterbuch in jeden Schlüsselschlitz legen wollen ... Ich glaube, Sie wollten' general_form' kopieren – MooingRawr

Antwort

0

Sie ordnen general_form bei jeder Iteration zu.

Könnte es sein, dass Sie den Wert von action_types zuweisen möchten?

Blattstaten [Aktion] = Aktionstypen [Aktion]?

general_form = { 
     "Percentage": np.nan, "DayPercentage": np.nan, "sample_size": np.nan, "Percentages": [], "DayPercentages": [] 
    } 
    #get all possible action types 
    action_types = self.df['Action Type'].tolist() 
    action_types = list(set(action_types)) 

    #give every action type its own dictionary within the main dictionary 
    sheetstats = {} 
    for action in action_types: 
     sheetstats[action] = action_types[action] 

    #push the percentage in the list inside the dictionary specified in 
    #action 
    for index, row in self.df.iterrows(): 
     percentage = row['Percentage'] 
     daypercentage = row['DayPercentage'] 
     action = row['Action Type'] 
     sheetstats[action]['Percentages'].append(percentage) 
     sheetstats[action]["DayPercentages"].append(daypercentage) 
2
sheetstats[action] = general_form 

ist im Grunde in jeder Keilnut das gleiche Wörterbuch setzen, können Sie dies als jeder Taste zeigen denken Sie zurück an general_form

Was können Sie tun, ist eine Kopie von general_form machen:

Der richtige Weg zum Kopieren von Datenstruktur ist die Verwendung des Moduls copy und es ist deepcopy Funktion, die tief str kopieren wird Zeilen (wie Klassen):

import copy 
for action in action_types: 
    sheetstats[action] = copy.deepcopy(general_form)