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的主要内容,如果未能解决你的问题,请参考以下文章

Pandas Dataframe 聚合对象类型

Pandas DataFrame:多个组的滚动集联合聚合

Python Pandas 中 DataFrame 的聚合?

如何使用 Pandas 或 Spark Dataframe 展平嵌套的 Excel 数据?

Pandas Dataframe groupby 聚合函数和动态列的最大值和最小值之间的差异

如何使用 pandas 聚合大型 DataFrame 中的多个列?