Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.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 尝试使用.loc[row\u indexer,col\u indexer]=值,即使在使用正式的_Python_Pandas - Fatal编程技术网

Python 尝试使用.loc[row\u indexer,col\u indexer]=值,即使在使用正式的

Python 尝试使用.loc[row\u indexer,col\u indexer]=值,即使在使用正式的,python,pandas,Python,Pandas,这是我的代码中的一行,我在其中获得设置WithCopyWarning: value1['Total Population']=value1['Total Population'].replace(to_replace='*', value=4) 然后我改为: row_index= value1['Total Population']=='*' value1.loc[row_index,'Total Population'] = 4 这仍然给出了同样的警告。我怎样才能摆脱它 另外,对于我使用过

这是我的代码中的一行,我在其中获得设置WithCopyWarning:

value1['Total Population']=value1['Total Population'].replace(to_replace='*', value=4)
然后我改为:

row_index= value1['Total Population']=='*'
value1.loc[row_index,'Total Population'] = 4
这仍然给出了同样的警告。我怎样才能摆脱它

另外,对于我使用过的convert\u对象(convert\u numeric=True)函数,我也收到了同样的警告,有没有办法避免这种情况

 value1['Total Population'] = value1['Total Population'].astype(str).convert_objects(convert_numeric=True)
这是我收到的警告消息:

试图在数据帧切片的副本上设置值。 尝试改用.loc[row\u indexer,col\u indexer]=value


请参阅文档中的注意事项:

您是否尝试过直接设置?:

value1.loc[value1['Total Population'] == '*', 'Total Population'] = 4
得到了解决方案:

我创建了一个新的DataFrame,只存储了我需要处理的列的值,现在没有错误了


奇怪,但有效。

我能够用如下语法避免相同的警告消息:

value1.loc[:, 'Total Population'].replace('*', 4)

请注意,数据帧不需要重新分配给它自己,即value1['Total Population']=value1['Total Population']…

我不知道这会对数据存储/内存造成多大影响,但它每次都会为您的平均数据帧修复它:

def addCrazyColFunc(df):
    dfNew = df.copy()
    dfNew['newCol'] = 'crazy'
    return dfNew

就像短信上说的。。。复制一份,你就可以走了。请如果有人可以修复以上没有副本,请评论。以上所有loc内容都不适用于这种情况。

我来这里是因为我想根据另一列中的值有条件地设置一个新列的值

对我起作用的是numpy。在哪里:

import numpy as np
import pandas as pd
...

df['Size'] = np.where((df.value > 10), "Greater than 10", df.value)
从,这相当于:

[xv if c else yv
 for c, xv, yv in zip(condition, x, y)]

这是zip的一个非常好的用法…

如果您使用
.loc[row,column]
但仍然得到相同的错误,可能是因为复制了另一个数据帧。您必须使用
.copy()

这是一个逐步的错误再现:

import pandas as pd

d = {'col1': [1, 2, 3, 4], 'col2': [3, 4, 5, 6]}
df = pd.DataFrame(data=d)
df
#   col1    col2
#0  1   3
#1  2   4
#2  3   5
#3  4   6
创建新列并更新其值:

df['new_column'] = None
df.loc[0, 'new_column'] = 100
df
#   col1    col2    new_column
#0  1   3   100
#1  2   4   None
#2  3   5   None
#3  4   6   None
我没有收到任何错误。但是,让我们根据前面的数据帧创建另一个数据帧:

new_df = df.loc[df.col1>2]
new_df
#col1   col2    new_column
#2  3   5   None
#3  4   6   None
现在,使用
.loc
,我将尝试以相同的方式替换一些值:

new_df.loc[2, 'new_column'] = 100
然而,我又得到了这个可恶的警告:

试图在数据帧切片的副本上设置值。尝试 改为使用.loc[row\u indexer,col\u indexer]=值

请参阅文档中的注意事项:

解决方案

创建新数据框时使用
.copy()
,将解决警告问题:

new_df = df.loc[df.col1>2].copy()
new_df.loc[2, 'new_column'] = 100
现在,您将不会收到任何警告


如果您的数据框是使用另一个数据框顶部的筛选器创建的,请始终使用
.copy()

,因为您同时更新该数据框中的同一组值,您可以尝试使用temp变量保存结果并应用回列,看看这是否有助于消除警告信息。你使用的是什么版本的python&pandas?我觉得这似乎很有道理。。但对我来说没用这是个救命稻草!