2016-10-08 71 views
1

我在「文件名」列由字符串組成的數據幀上進行迭代。我有以下,但是,我得到以下錯誤。在Dataframe上迭代

結果是我得到一個不同的數據幀

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 

的錯誤是:

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

的修復程序的任何想法?

回答

3

的簡單的解決你的問題是解壓縮從iterrows

來的元組
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 

對此的改進將使用enumerate來捕獲k,而無需自行跟蹤。

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'] 

不過,我不太清楚你在做什麼。如果碰巧你試圖捕獲從第一,第二和第三項開始的每個第三元素,那麼你沒有完成這個。如果您確信這一邏輯,則忽略以下建議。

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']) 

或者

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

當你通過df與iter它將返回一個元組的每行row [0]是行的索引和行[1]是一個系列。

,所以你可以這樣做:

row[1]['Filename'] 

我個人喜歡用.itertuples()返回命名元組ITER:

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