Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.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 在创建列时设置WithCopyWarning_Python_Pandas - Fatal编程技术网

Python 在创建列时设置WithCopyWarning

Python 在创建列时设置WithCopyWarning,python,pandas,Python,Pandas,我正在尝试为我的数据创建一个称为“mv_avg”的移动平均值列。我得到了一个我无法修复的设置。我可以抑制警告,但我无法确定在代码中的何处创建副本,我希望利用最佳实践。我在下面创建了一个可概括的示例来说明这个问题 data = {'category' : ['a', 'a', 'a', 'b', 'b', 'b'], 'value' : [1,2,3,4,5,6]} df = pd.DataFrame(data) df_a = df.loc[df['category'] == 'a'] df_a[

我正在尝试为我的数据创建一个称为“mv_avg”的移动平均值列。我得到了一个我无法修复的设置。我可以抑制警告,但我无法确定在代码中的何处创建副本,我希望利用最佳实践。我在下面创建了一个可概括的示例来说明这个问题

data = {'category' : ['a', 'a', 'a', 'b', 'b', 'b'], 'value' : [1,2,3,4,5,6]}
df = pd.DataFrame(data)
df_a = df.loc[df['category'] == 'a']
df_a['mv_avg'] = df_a['value'].rolling(window=2).mean()
这将返回:

SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
我还尝试了更详细的版本:

df_a.loc[: , 'mv_avg'] = df_a.loc[:,'value'].rolling(window=2).mean()

但我也犯了同样的错误。在没有警告的情况下完成此操作的最佳方法是什么?

您可以使用.copy()创建副本

或者您可以使用索引器,例如:

import pandas as pd
data = {'category' : ['a', 'a', 'a', 'b', 'b', 'b'], 'value' : [1,2,3,4,5,6]}
df = pd.DataFrame(data)
indexer = df[df['category'] == 'a'].index
df_a = df.loc[indexer, :]
df_a['mv_avg'] = df_a['value'].rolling(window=2).mean()
这里有三种选择

  • 忽略/过滤警告;在这种情况下,这是虚假的,因为您故意将其分配给过滤后的数据帧

  • 如果您使用了
    df
    ,您可以
    del
    它,这将阻止警告,因为
    df\u a
    将不再包含对
    df
    的引用

  • 像另一个答案一样抄一份


  • 如果是显式复制(
    df_a=df.loc[df['category']='a'].copy()
    ),数据是否复制了两次(首先是通过布尔索引,然后是通过
    .copy()
    )?@Aivar,不清楚,它可能是也可能不是双重副本。(这是我在github上提出的一个问题)
    import pandas as pd
    data = {'category' : ['a', 'a', 'a', 'b', 'b', 'b'], 'value' : [1,2,3,4,5,6]}
    df = pd.DataFrame(data)
    indexer = df[df['category'] == 'a'].index
    df_a = df.loc[indexer, :]
    df_a['mv_avg'] = df_a['value'].rolling(window=2).mean()