使用iterrows()修改数据框中的列-类型错误

时间:2019-07-13 03:15:35

标签: python pandas

我是刚开始使用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'>

2 个答案:

答案 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