数据框熊猫聚合和/或分组依据

时间:2019-09-27 21:31:02

标签: python-3.x group-by pandas-groupby aggregation

我有一个这样的数据框:

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跟踪(最近的呼叫   持续)   /usr/local/lib/python3.6/dist-packages/pandas/core/groupby/groupby.py   适用于(self,func,* 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分辨率= f(组)       191如果不是_is_indexed_like(res,group_axes):

     

TypeError:“ SimpleImputer”对象不可调用

     

在处理上述异常期间,发生了另一个异常:

     

TypeError跟踪(最近的呼叫   最后)在()         5返回imp         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   适用于(self,func,* args,** kwargs)       699       700个,带有_group_selection_context(自己):   -> 701 return 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 def _python_apply_general(self,f):       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分辨率= 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 ((自身,密钥))3956 if is_scalar(key):3957密钥= com.cast_scalar_indexer(key)   -> 3958如果isinstance(key,slice)返回getitem(key)3959 3960:

     

IndexError:索引0超出了大小为0的轴0的边界

我要求社区提供帮助以完成此过程。

1 个答案:

答案 0 :(得分: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