Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用for循环更新df_Python - Fatal编程技术网

Python 使用for循环更新df

Python 使用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

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

您只需创建一个变量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必须告诉您最佳实践,但没有注意将列大写。“那确实很痛苦。”奇赫布涅克斯,你真是太好了。谢谢。谢谢你花时间回答。谢谢你花时间回答