Dataframe Pandas 聚合和/或 groupby
Posted
技术标签:
【中文标题】Dataframe Pandas 聚合和/或 groupby【英文标题】:Dataframe Pandas aggregation and/or groupby 【发布时间】:2020-01-28 04:37:11 【问题描述】:我有一个这样的数据框:
serie = [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]
values = [2, 2, 2, 1, 2, 2, 1, 1, 1, 1, 1, 2]
series_X_values = 'series': serie, 'values': values
df_mytest = pd.DataFrame.from_dict(series_X_values)
df_mytest
我需要创建第三列(例如更频繁)
df_mytest['most_frequent'] = np.nan
它们的值将是按“系列”分组的“值”列中最常观察到的值,或者将“值”列中的值替换为最常见的术语本身,如下面的数据框中所示:
serie = [1, 2, 3]
values = [2, 2, 1]
series_X_values = 'series': serie, 'values': values
df_mytest = pd.DataFrame.from_dict(series_X_values)
df_mytest
我尝试了一些不成功的选项,例如:
def personal_most_frequent(col_name):
from sklearn.impute import SimpleImputer
imp = SimpleImputer(strategy="most_frequent")
return imp
df_result = df_mytest.groupby('series').apply(personal_most_frequent('values'))
但是……
TypeError Traceback(最近调用 最后的) /usr/local/lib/python3.6/dist-packages/pandas/core/groupby/groupby.py 在应用(自我,函数,*args,**kwargs) 688尝试: --> 689 结果 = self._python_apply_general(f) 690 例外:
5 帧 /usr/local/lib/python3.6/dist-packages/pandas/core/groupby/groupby.py 在 _python_apply_general(self, f) 706 个键、值、变异 = self.grouper.apply(f, self._selected_obj, --> 707 self.axis) 第708章
/usr/local/lib/python3.6/dist-packages/pandas/core/groupby/ops.py 应用(自我,f,数据,轴) 189 group_axes = _get_axes(组) --> 190 res = f(组) 191 如果不是 _is_indexed_like(res, group_axes):
TypeError: 'SimpleImputer' 对象不可调用
在处理上述异常的过程中,又发生了一个异常:
TypeError Traceback(最近调用 最后)在() 5 返回小鬼 6 ----> 7 df_result = df_mytest.groupby('series').apply(personal_most_frequent('values'))
/usr/local/lib/python3.6/dist-packages/pandas/core/groupby/groupby.py 在应用(自我,函数,*args,**kwargs) 699 700 与 _group_selection_context(self): --> 701 返回 self._python_apply_general(f) 702 703返回结果
/usr/local/lib/python3.6/dist-packages/pandas/core/groupby/groupby.py 在 _python_apply_general(self, f) 第705章 706 个键、值、变异 = self.grouper.apply(f, self._selected_obj, --> 707 self.axis) 708 709返回self._wrap_applied_output(
/usr/local/lib/python3.6/dist-packages/pandas/core/groupby/ops.py 应用(自我,f,数据,轴) 188 # 组可能被修改 189 group_axes = _get_axes(组) --> 190 res = f(组) 191 如果不是 _is_indexed_like(res, group_axes): 192突变=真
TypeError: 'SimpleImputer' 对象不可调用
还有……
df_mytest.groupby(['series', 'values']).agg(lambda x:x.value_counts().index[0])
但又...
IndexError Traceback(最近调用 最后的) /usr/local/lib/python3.6/dist-packages/pandas/core/groupby/ops.py 在 agg_series (self, obj, func) 589尝试: --> 590 返回 self._aggregate_series_fast(obj, func) 591 例外:
12 帧 pandas/_libs/reduction.pyx 中 pandas._libs.reduction.SeriesGrouper.get_result()
pandas/_libs/reduction.pyx 在 pandas._libs.reduction.SeriesGrouper.get_result()
IndexError:索引 0 超出轴 0 的范围,大小为 0
在处理上述异常的过程中,又发生了一个异常:
IndexError Traceback(最近调用 最后的) /usr/local/lib/python3.6/dist-packages/pandas/core/indexes/base.py 在 getitem(self, key) 3956 if is_scalar(key): 3957 key = com.cast_scalar_indexer(key) -> 3958 return getitem(key) 3959 3960 if isinstance(key, slice):
IndexError:索引 0 超出轴 0 的范围,大小为 0
我向社区寻求帮助以完成此过程。
【问题讨论】:
在值 1 和 2 具有相同计数的系列 2 的情况下,这应该如何表现? 【参考方案1】:假设您可以通过取最大值来打破平局等代表值,您可以执行以下操作:
df_mf = df_mytest.groupby('series')['values'].apply(lambda ds: ds.mode().max()).to_frame('most_frequent')
df_mytest.merge(df_mf, 'left', left_on='series', right_index=True)
输出:
series values most_frequent
0 1 2 2
1 1 2 2
2 1 2 2
3 1 1 2
4 2 2 2
5 2 2 2
6 2 1 2
7 2 1 2
8 3 1 1
9 3 1 1
10 3 1 1
11 3 2 1
【讨论】:
以上是关于Dataframe Pandas 聚合和/或 groupby的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas 中 DataFrame 的聚合?
如何使用 Pandas 或 Spark Dataframe 展平嵌套的 Excel 数据?