用 for 循环更新 df

时间:2021-01-30 21:36:08

标签: python

我有这个 df

    Var     Zip
0   x   803020
1   y   80302
2   z   803098

我正在应用这个 for 循环,即使我没有收到错误,df 也没有改变

for x in df['Zip']:
    y = len(x)
    if y == 6:
         x = x[:-1]
            
print(df)

输出

    Var     Zip
0   x   803020
1   y   80302
2   z   803098

期望输出

    Var     Zip
0   x   80302
1   y   80302
2   z   80309

3 个答案:

答案 0 :(得分:2)

这不符合最佳实践。您应该将 df.apply 用于这样的事情:

df['Zip'] = df['Zip'].apply(lambda x: x[:-1] if len(x) == 6 else x)

如果您的列是 int 并且需要保持 int,这也适用:

df['Zip'] = df['Zip'].apply(lambda x: int(str(x)[:-1]) if len(str(x)) == 6 else x)

答案 1 :(得分:2)

您可以像这个例子一样使用 df.apply

df['Zip'] = df.apply(
    lambda row: row['Zip'][:-1] if len(row['Zip']) == 6 else row['Zip'],
    axis=1
)

print(df)

  Var    Zip
0   x  80302
1   y  80302
2   z  80309

PS: 我假设 Zip 列被标记为 str。如果没有,您可以像这样将其转换为 str

df['Zip'] = df['Zip'].astype(str)

编辑:

如果您需要更快的方法,可以使用:

df['Zip'] = df['Zip'].apply(lambda row: row[:-1] if len(row) == 6 else row)

这里是一些基准:

In [1]: %timeit df['Zip'] = df.apply(lambda row: row['Zip'][:-1] if len(row['Zip']) == 6 else row['Zip'], axis=1)                                                                                                  
714 µs ± 18.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [2]: %timeit df['Zip'] = df['Zip'].apply(lambda row: row[:-1] if len(row) == 6 else row)                                                                                                                                
274 µs ± 3.62 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

答案 2 :(得分:-1)

您只是创建了一个变量 x,它是单元格值的字符串切片,您没有对它做任何事情。

试试这个。

for n in range(len(df['Zip'])):
    y = len(df['Zip'][n])
    if y == 6:
         df['Zip'][n] = df['Zip'][n][:-1]