Pandas SettingWithCopyWarning仅在函数

时间:2017-05-17 19:21:07

标签: python-3.x pandas warnings

我正在使用Jupyter笔记本(不确定这是否相关)而且我无法理解为什么Pandas会抛出SettingWithCopyWarning而只是在某种情况下。

这是我的代码的第一个版本:

def read_in_yearly_data(file_name):
    print('\t%s' % file_name)

    df = pd.read_csv('../' + file_name + '.csv', header=None)

    # Drop the first 4 columns, and set names of the remaining 4 columns
    for i in range(4):
        del df[i]

    df.columns = ['Part_Name', 'Date', 'Description', 'Units']

    return df

yearly_data = []
for year in ['09', '10', '11']:
    yearly_data.append(read_in_yearly_data('20' + year + ' data'))

all_data = pd.concat(yearly_data, axis=0, join='outer')

parts_to_exclude = misc.PART_NAMES
all_data = all_data.query('Part not in @parts_to_exclude')

all_data['Units'] = all_data['Units'].apply(lambda x: hf.to_int(x))

第二个版本(将代码包装在一个函数中):

def read_in_yearly_data(file_name):
    print('\t%s' % file_name)

    df = pd.read_csv('../' + file_name + '.csv', header=None)

    # Drop the first 4 columns, and set names of the remaining 4 columns
    for i in range(4):
        del df[i]

    df.columns = ['Part_Name', 'Date', 'Description', 'Units']

    return df

def myfunc():
    yearly_data = []
    for year in ['09', '10', '11']:
        yearly_data.append(read_in_yearly_data('20' + year + ' data'))

    all_data = pd.concat(yearly_data, axis=0, join='outer')

    parts_to_exclude = misc.PART_NAMES
    all_data = all_data.query('Part not in @parts_to_exclude')

    all_data['Units'] = all_data['Units'].apply(lambda x: hf.to_int(x))

my_func()

调用hf.to_int(x)获取'单位'并将其转换为整数(某些单位存储为字符串并使用逗号,例如'2,000.0'。

第一个版本的代码在第二个版本没有产生警告。

甚至将最后一行更改为

all_data.loc[:, 'Units'] = all_data['Units'].apply(lambda x: hf.to_int(x))

在第二个版本中没有改变任何东西,我很难理解为什么。

1 个答案:

答案 0 :(得分:0)

如果更改

,错误就会消失
all_data = all_data.query('Part not in @parts_to_exclude')

要:

all_data = all_data.query('Part not in @parts_to_exclude').copy()

我还不太清楚为什么当它不在函数中时它没有给你一个错误。