动态参数不支持解决嵌套重命名器
solving nested renamer is not supported with dynamic arguments
if cat_vars:
df["static_cat"] = (
df.groupby("group_col")
.agg({i: "first" for i in cat_vars})
.values.tolist()
)
错误:
packages\pandas\core\groupby\generic.py in aggregate(self, func, *args, **kwargs)
926 func = _maybe_mangle_lambdas(func)
927
--> 928 result, how = self._aggregate(func, *args, **kwargs)
929 if how is None:
930 return result
packages\pandas\core\base.py in _aggregate(self, arg, *args, **kwargs)
355 obj.columns.intersection(keys)
356 ) != len(keys):
--> 357 raise SpecificationError("nested renamer is not supported")
358
359 from pandas.core.reshape.concat import concat
SpecificationError: nested renamer is not supported
类似的问题已解决 。但我希望它是动态的,即根据 cat_vars 代码中的元素进行调整。
例如
如果 cat_vars=[var1,var2] 我可以通过 agg(var1="first" ,var2="first"})
来解决问题。但是如果它有 3 个变量呢?
数据:
df = pd.DataFrame({'group_col':[1,1,2,2,3],
'var1':range(5),
'var2':list('abcde')})
cat_vars = ['var1','var2']
如果只需要一个聚合函数更简单的是:
df1 = df.groupby("group_col")[cat_vars].first()
或者将命名聚合与传递字典一起使用:
df1 = df.groupby("group_col").agg(**{i:(i, "first") for i in cat_vars})
看来您的解决方案也应该有效:
df1 = df.groupby("group_col").agg({i: "first" for i in cat_vars})
print (df1)
var1 var2
group_col
1 0 a
2 2 c
3 4 e
编辑:
对于新列使用:
df = pd.DataFrame({'group_col':[1,1,2,2,3],
'var1':range(5),
'var2':list('abcde')})
cat_vars = ['var1','var2']
df2 = df.join(df.groupby("group_col")[cat_vars].transform('first').add_prefix('new_'))
print (df2)
group_col var1 var2 new_var1 new_var2
0 1 0 a 0 a
1 1 1 b 0 a
2 2 2 c 2 c
3 2 3 d 2 c
4 3 4 e 4 e
if cat_vars:
df["static_cat"] = (
df.groupby("group_col")
.agg({i: "first" for i in cat_vars})
.values.tolist()
)
错误:
packages\pandas\core\groupby\generic.py in aggregate(self, func, *args, **kwargs)
926 func = _maybe_mangle_lambdas(func)
927
--> 928 result, how = self._aggregate(func, *args, **kwargs)
929 if how is None:
930 return result
packages\pandas\core\base.py in _aggregate(self, arg, *args, **kwargs)
355 obj.columns.intersection(keys)
356 ) != len(keys):
--> 357 raise SpecificationError("nested renamer is not supported")
358
359 from pandas.core.reshape.concat import concat
SpecificationError: nested renamer is not supported
类似的问题已解决 agg(var1="first" ,var2="first"})
来解决问题。但是如果它有 3 个变量呢?
数据:
df = pd.DataFrame({'group_col':[1,1,2,2,3],
'var1':range(5),
'var2':list('abcde')})
cat_vars = ['var1','var2']
如果只需要一个聚合函数更简单的是:
df1 = df.groupby("group_col")[cat_vars].first()
或者将命名聚合与传递字典一起使用:
df1 = df.groupby("group_col").agg(**{i:(i, "first") for i in cat_vars})
看来您的解决方案也应该有效:
df1 = df.groupby("group_col").agg({i: "first" for i in cat_vars})
print (df1)
var1 var2
group_col
1 0 a
2 2 c
3 4 e
编辑:
对于新列使用:
df = pd.DataFrame({'group_col':[1,1,2,2,3],
'var1':range(5),
'var2':list('abcde')})
cat_vars = ['var1','var2']
df2 = df.join(df.groupby("group_col")[cat_vars].transform('first').add_prefix('new_'))
print (df2)
group_col var1 var2 new_var1 new_var2
0 1 0 a 0 a
1 1 1 b 0 a
2 2 2 c 2 c
3 2 3 d 2 c
4 3 4 e 4 e