迭代Dataframe

时间:2016-10-08 23:05:46

标签: python pandas dataframe

我正在尝试迭代一个数据框,其中“Filename”列由字符串组成。我有以下内容,但是,我得到以下错误。

结果是一个不同的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

有任何修复的想法吗?

2 个答案:

答案 0 :(得分:4)

当您使用df.iterrows()通过df时,它会为每行返回一个元组,其中row [0]是行的索引,而行[1]是一个系列。

所以你可以这样做:

row[1]['Filename']

我个人喜欢使用返回名为tuple的.itertuples()

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

答案 1 :(得分: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']

但是,我不太确定你在做什么。如果你偶然尝试捕获从第一,第二和第三个条目开始的每个第3个元素,那么你就没有完成它。如果您确定这个逻辑,那么请忽略以下建议。

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