我正在尝试迭代一个数据框,其中“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
有任何修复的想法吗?
答案 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'})