2016-10-08 3 views
1

Ich versuche, über einen Datenrahmen zu iterieren, wo die Spalte "Dateiname" aus Strings besteht. Ich habe folgendes, allerdings erhalte ich folgenden Fehler.Iterieren über Dataframe

Ergebnis ist ein anderer Datenrahmen

k = 1 
l = 0 
for row in df.iterrows(): 
    if k % 3 == 0: 
     result.loc[l, 'H2'] = row['Filename'] 
     l += 1 
    elif k % 2 == 0: 
     result.loc[l, 'H1'] = row['Filename'] 
    else: 
     result.loc[l, 'V'] = row['Filename'] 
    k += 1 

Der Fehler, den ich bekommen ist:

TypeError: tuple indices must be integers or slices, not str 

Jede Idee, ob ein Update?

Antwort

3

Die einfache Lösung für Ihr Problem ist das Tupel von iterrows

kommen auspacken
k = 1 
l = 0 
for i, row in df.iterrows(): 
    if k % 3 == 0: 
     result.loc[l, 'H2'] = row['Filename'] 
     l += 1 
    elif k % 2 == 0: 
     result.loc[l, 'H1'] = row['Filename'] 
    else: 
     result.loc[l, 'V'] = row['Filename'] 
    k += 1 

Eine Verbesserung wäre, enumerate zu verwenden, um k zu erfassen, ohne es selbst verfolgen zu müssen.

l = 0 
for k, (i, row) in enumerate(df.iterrows(), 1): 
    if k % 3 == 0: 
     result.loc[l, 'H2'] = row['Filename'] 
     l += 1 
    elif k % 2 == 0: 
     result.loc[l, 'H1'] = row['Filename'] 
    else: 
     result.loc[l, 'V'] = row['Filename'] 

Aber ich bin nicht ganz sicher, was du tust. Wenn Sie versuchen, jedes dritte Element, beginnend mit dem ersten, zweiten und dritten Eintrag, zu erfassen, dann schaffen Sie das nicht. Wenn Sie sich dieser Logik sicher sind, ignorieren Sie den folgenden Vorschlag.

pd.concat([df.Filename.iloc[0::3].reset_index(drop=True), 
      df.Filename.iloc[1::3].reset_index(drop=True), 
      df.Filename.iloc[2::3].reset_index(drop=True)], 
      axis=1, keys=['V', 'H1', 'H2']) 

Oder

df.Filename.groupby(np.arange(df.shape[0]) % 3) \ 
    .apply(pd.Series.reset_index, drop=True) \ 
    .unstack(0).rename(columns={0: 'V', 1: 'H1', 2: 'H2'}) 
3

Wenn Sie iter durch df mit df.iterrows() wird es ein Tupel für jede Zeile zurückgeben wo Zeile [0] ist der Index der Zeile und Zeile [1] ist eine Serie.

so könnten Sie tun:

row[1]['Filename'] 

ich persönlich mit .itertuples() Iter wie die Tupel namens Returns:

for row in df2.itertuples(): 
    print row.Filename