使用df.groupby.transform()链接的python方法中的复制警告设置

时间:2018-02-03 17:57:20

标签: python pandas dataframe group-by

我需要在pandas dataframe中创建一个新列,它是基于分组的count和sum。我正在使用如下方法链接。

df['total_sum']=df.groupby('column1')['column 2'].transform('sum') 
df['total_cnt']=df.groupby('column1')['column 2'].transform('count')

但我正在使用复制警告进行设置。我得到了正确的结果,但我想避免警告。 我正在尝试解决方法,但无法获得解决方案。

2 个答案:

答案 0 :(得分:0)

创建

SettingWithCopyWarning是为了标记链式分配,因pandas documentation中提供的原因而不鼓励这些分配。

该文档还包括警告:

  

链式分配警告/异常的目标是   告知用户可能无效的分配。 可能有误   阳性;无意中链式分配的情况   报道。

在我看来,你的逻辑以及你对它的期望是明确的。要禁用警告,您可以使用:

pd.options.mode.chained_assignment = None  # default='warn'

您可能希望仅针对使用groupby + transform操作的代码部分禁用它,以便不会错过有用的警告。

答案 1 :(得分:0)

您在添加新列之前是否过滤了行?或者以其他方式切割数据框?

e.g。如果我运行这个,那么我没有得到警告:

import pandas as pd   
df0 = pd.DataFrame({'column1': ['A', 'B'] * 6,
                   'column 2': range(12),
                   'column3': ['foo', 'bar', 'baz'] * 4})
df = df0
# df = df0[df0.column3.isin(['foo', 'bar'])]
# df = df0[df0.column3.isin(['foo', 'bar'])].copy()
df['total_sum'] = df.groupby('column1')['column 2'].transform('sum')
df['total_cnt'] = df.groupby('column1')['column 2'].transform('count')
print df

但如果我这样做,那么我会收到警告:

import pandas as pd   
df0 = pd.DataFrame({'column1': ['A', 'B'] * 6,
                   'column 2': range(12),
                   'column3': ['foo', 'bar', 'baz'] * 4})
# df = df0
df = df0[df0.column3.isin(['foo', 'bar'])]
# df = df0[df0.column3.isin(['foo', 'bar'])].copy()
df['total_sum'] = df.groupby('column1')['column 2'].transform('sum')
df['total_cnt'] = df.groupby('column1')['column 2'].transform('count')
print df

我可以通过显式复制来抑制数据帧的行,如下所示:

import pandas as pd   
df0 = pd.DataFrame({'column1': ['A', 'B'] * 6,
                   'column 2': range(12),
                   'column3': ['foo', 'bar', 'baz'] * 4})
# df = df0
# df = df0[df0.column3.isin(['foo', 'bar'])]
df = df0[df0.column3.isin(['foo', 'bar'])].copy()
df['total_sum'] = df.groupby('column1')['column 2'].transform('sum')
df['total_cnt'] = df.groupby('column1')['column 2'].transform('count')
print df