我是刚开始使用iterrows()。我想根据字符串的长度更新“时间”列中的字符串,并进行相应的修改。我收到类型错误。
def time_edits(x):
for idx, row in df.iterrows():
if df.loc[idx, len('time')] == 2:
df.loc[idx, 'time'] = '0' + df.loc[idx, 'time'] + '0'
elif df.loc[idx, len('time')] == 3:
df.loc[idx, 'time'] = '0' + df.loc[idx, 'time']
else:
df.loc[idx, 'time']
return
df["time"].apply(time_edits)
预期的输出是根据字符串的长度在适当的位置修改列。
TypeError: cannot do label indexing on <class 'pandas.core.indexes.base.Index'> with these indexers [4] of <class 'int'>
答案 0 :(得分:1)
那行不通。
iterrows()遍历数据帧的所有行。在apply
中,您将一个函数应用于每个寄存器。所以,您要说的是:到“时间”列中的每个寄存器,对其所有行进行迭代,等等。
如您所见,这没有多大意义。
我认为以下方法应该有效:
def time_edits(x):
if len(x) == 2:
return [desired output in this case]
elif len(x) == 3:
return [desired output in this case]
else:
return [desired output in this case]
要将结果保存在原始列中:
df["time"] = df["time"].apply(time_edits)
希望这会有所帮助!
答案 1 :(得分:0)
df.loc
使用行ID和列名,而不是列的长度。因此,您应该按照以下方式重写代码:
代替if df.loc[idx, len('time')] == 2
,
您应该使用if len(df.loc[idx, 'time']) == 2
如果使用iterrows()
,则不必使用apply
。