我有这个 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
答案 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]