Python 使用for循环更新df
我有这个dfPython 使用for循环更新df,python,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 8030
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
您只需创建一个变量x,它是单元格值的字符串片段,您不需要对它做任何操作 试试这个
for n in range(len(df['Zip'])):
y = len(df['Zip'][n])
if y == 6:
df['Zip'][n] = df['Zip'][n][:-1]
您只需创建一个变量x,它是单元格值的字符串片段,您不需要对它做任何操作 试试这个
for n in range(len(df['Zip'])):
y = len(df['Zip'][n])
if y == 6:
df['Zip'][n] = df['Zip'][n][:-1]
这不符合最佳做法。您应该使用df.apply进行如下操作:
df['Zip'] = df['Zip'].apply(lambda x: x[:-1] if len(x) == 6 else x)
df['Zip'] = df['Zip'].astype(str)
如果您的列是int并且需要保持为int,则这也适用于:
df['Zip'] = df['Zip'].apply(lambda x: int(str(x)[:-1]) if len(str(x)) == 6 else x)
这不符合最佳做法。您应该使用df.apply进行如下操作:
df['Zip'] = df['Zip'].apply(lambda x: x[:-1] if len(x) == 6 else x)
df['Zip'] = df['Zip'].astype(str)
如果您的列是int并且需要保持为int,则这也适用于:
df['Zip'] = df['Zip'].apply(lambda x: int(str(x)[:-1]) if len(str(x)) == 6 else x)
您可以像下面的示例一样使用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'].apply(lambda x: x[:-1] if len(x) == 6 else x)
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)
您可以像下面的示例一样使用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'].apply(lambda x: x[:-1] if len(x) == 6 else x)
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)
请注意,通过使用axis=1,这是一个比仅在系列上使用apply慢得多的解决方案。感谢您的帮助help@WolVes是的,你说得对。我已经更新了我的答案。谢谢。请注意,通过使用axis=1,这是一个比仅在系列上使用apply慢得多的解决方案。感谢您的帮助help@WolVes是的,你说得对。我已经更新了我的答案。谢谢。谢谢你的帮助。我想OP想要修改Zip列,而不是创建另一列。此外,通过df['Zip']=df['Zip']可以很容易地将列转换为str。astypestroof必须告诉您最佳实践,但没有注意将列大写。“那确实很痛苦。”奇赫布涅克斯,你真是太好了。谢谢。谢谢你的帮助。我想OP想要修改Zip列,而不是创建另一列。此外,通过df['Zip']=df['Zip']可以很容易地将列转换为str。astypestroof必须告诉您最佳实践,但没有注意将列大写。“那确实很痛苦。”奇赫布涅克斯,你真是太好了。谢谢。谢谢你花时间回答。谢谢你花时间回答