2017-03-29 13 views
1

Ich versuche, doppelte Zeilen während einer Datenrahmeniteration zu erstellen. Grundsätzlich habe ich zwei for-Schleifen, wobei ich in der ersten Schleife Werte in eine API einspeise und in der zweiten Schleife Werte aus der JSON-Ausgabe extrahiere.Pandas - Doppelte Zeilen bei Iteration

Ich möchte die aktuelle Zeile duplizieren und N Zeilen basierend darauf erstellen, wie viele Elemente auf der Liste sind. Zum Beispiel:

Name Date  Sales  
John 1/1/17 100 
Bob  1/2/17 200 

items = [] 
for row in df.sales: 
    url = 'www.samplewebsite.com/values=xyz/APIKEY=MYAPIKEY' 
    result = simplejson.load(urllib.urlopen(url)) 
    for i in range(0, len(result['column a'][0]['column b']: 
     items.append(result['column a'][0]['column b'][i]['item']) 

In dieser speziellen Schleife werden zwei Listen erstellt (ein für John, der andere für Bob):

items = ['Paper','Paper Clips','Pencils'] 
items = ['Notebook','Stapler','Highlighter','Pen'] 

gewünschte Ausgabe:

Name Date  Sales  Item 
John 1/1/17 100  Paper 
John 1/1/17 100  Paper Clips 
John 1/1/17 100  Pencils 
Bob  1/2/17 200  Notebook 
Bob  1/2/17 200  Stapler 
Bob  1/2/17 200  Highlighter 
Bob  1/2/17 200  Pen 

Danke im Voraus!

Antwort

1

Es gibt eine Handvoll Möglichkeiten, dies zu tun. Innerhalb Ihrer Schleife könnten Sie nach dem Extrahieren jedes Elements ein Element und einen Namen in einen Hauptdatenrahmen schieben. Oder du könntest einen Haufen Gegenstände zusammen mit einem Namen in einen df schieben und dann nach jedem Namen an den Haupt-df anhängen. Oder Sie könnten alle Dinge zusammentragen und sie dann ganz am Ende anhängen.

So würden Sie alle Elemente, die zu einem Namen gehören, in ein df einfügen und dann an einen Master-df anhängen. Sie müssten dies innerhalb der Schleife einmal für jeden Namen tun:

# set this up before the loop 
mainDF = pd.DataFrame(columns=['Name','Items']) 

## this gets populated inside the loop 
name = 'John' 
items = ['Paper','Paper Clips','Pencils'] 

# inside the loop create a df to hold one name and all the items belonging to that name 
df = pd.DataFrame(columns=['Name','Items']) 

#populate... do items first then fill in all the name with the one name 
df.Items = items 
df.Name = name 

## then append the above df into the main df 
mainDF = mainDF.append(df) 
+0

Dank JD! Das einzige Problem, auf das ich gestoßen bin, ist, dass der Name Null für alle duplizierten Zeilen ist. –

+1

hmmm .... hast du die Artikel zuerst hinzugefügt? Das sollte Ihnen die richtige Anzahl von Zeilen geben. dann setze die Namensspalte des inneren df auf den Namen, an dem du interessiert bist. Das sollte allen Zeilen den Namen zuweisen, unabhängig davon, ob es sich um einen Betrogenen handelt oder nicht. Wo kommt der Null ins Spiel? im inneren oder äußeren DF? –

+1

Nevermind - ich habe es herausgefunden. Danke für Ihre Hilfe!! –