我有一个这样的数据框:
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的边界
我要求社区提供帮助以完成此过程。
答案 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