2016-10-08 30 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