我需要在pandas dataframe中创建一个新列,它是基于分组的count和sum。我正在使用如下方法链接。
df['total_sum']=df.groupby('column1')['column 2'].transform('sum')
df['total_cnt']=df.groupby('column1')['column 2'].transform('count')
但我正在使用复制警告进行设置。我得到了正确的结果,但我想避免警告。 我正在尝试解决方法,但无法获得解决方案。
答案 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