【问题标题】:What is the warning that pandas is trying to tell me?熊猫试图告诉我的警告是什么?
【发布时间】:2016-04-19 08:31:13
【问题描述】:

我有以下代码,它只是具有一个函数,该函数接受一个输入数据帧并输出一个按label 对它们进行分组并将它们相加的版本。

import pandas as pd
import random
import numpy as np

random.seed = 10

input_data = np.array(
[
[random.randint(0,9) for x in range(4)]+['g'],
[random.randint(0,9) for x in range(4)]+['g'],
[random.randint(0,9) for x in range(4)]+['a'],
[random.randint(0,9) for x in range(4)]+['b'],
[random.randint(0,9) for x in range(4)]+['b']
]
)

input_df = pd.DataFrame(data=input_data, columns=['A','B', 'C', 'D', 'label'])

def group_and_sum(input_df):
    final_df = pd.DataFrame()
    for gr,subdf in input_df.groupby('label'):
        new_df = pd.DataFrame()

        new_df['label'] = [gr]
        columns = [x for x in input_df.columns if x!='label']
        subdf[columns] = subdf[columns].values.astype(float)
        for col in columns:
            new_df[col] = [sum(subdf[col].values)]

        new_df['sum'] = sum([new_df[x].values for x in columns])
        final_df = pd.concat([final_df, new_df])
    final_df.index = np.array(range(len(final_df)))
    return final_df

final_df = group_and_sum(input_df)

会引发以下警告:

Warning (from warnings module):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas-0.17.0-py2.7-macosx-10.6-intel.egg/pandas/core/frame.py", line 2269
    self.ix._setitem_with_indexer((slice(None), indexer), value)
SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

两件事:

1) 当我查看警告 here 时,它似乎与我无关。正如警告中提供的链接所示,我没有做任何类似chained-indexing 的事情。

2)当我尝试在函数之外重现错误时,由于某种原因我不能:

input_df[['A']]=input_df[['A']].astype(float)
input_df[['A','B']]=input_df[['A','B']].astype(float)

...它们都运行得很好。

是否有其他方法可以重现此警告,它是否适用于此处?谢谢。

【问题讨论】:

    标签: python pandas dataframe sklearn-pandas


    【解决方案1】:

    我相信警告是因为您的subdf[columns] = subdf[columns].values.astype(float) 行。您从 groupby 获得了 subdf,因此 subdf 是对原始 DataFrame 某些行的引用。在此切片上设置值会导致警告。换句话说,就好像你做了链式索引:

    input_df[rows_that_are_part_of_this_group][columns] = ...
    

    【讨论】:

    • 好的,所以我猜你要告诉我的是 "subdf" 仍然以某种方式引用或指向 input_df?我猜groupby 对象中存在一些细微差别。
    • 这是我能够重现警告的唯一方法:input_df[input_df['label']=='g']['label'] = input_df['A'] 虽然,我仍然不清楚这比input_df[['A']]=input_df[['A']].astype(float) 更危险(这是我的问题)
    • @Hunle:并不是说它“危险”,只是它有时比较慢。此外,如果您有一系列复杂的切片操作,有时它们可​​能不会在您分配时更新原始对象。
    猜你喜欢
    • 2015-08-29
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2018-11-24
    • 1970-01-01
    相关资源
    最近更新 更多