【问题标题】:Pandas Complex GroupBy and Apply on Machine Learning DatasetPandas 复杂 GroupBy 并应用于机器学习数据集
【发布时间】:2020-01-24 14:46:57
【问题描述】:

我有一个用于机器学习数据集的数据集。下面列出了我的数据框。

数据框 = df

      memid     year     code1     code2    ....... n amount of columns
        1       2014      8888      654
        2       2016      13456     4353
        2       2016      12345     3333
        1       2014      123333    1111 
        1       2016      55555     2222 
        1       2016      99999     2222 

我的目标是汇总数据集并将年份作为列名中的度量添加到整个数据框(即 n 列)我下面的表结构是我的目标

以下目标数据框:

 memid    code1_2014     code1_2015     code1_2016      code2_2014       code2_2015     code2_2016
   1      8888, 123333                  55555, 99999     654, 1111                          2222
   2                                    13456, 12345                                     4353, 3333                  

这段代码的目标是为数据集中除memid之外的所有列实现上述列结构。我知道这是一个复杂的 groupby 和 .apply 或 join 方法,但是我无法实现目标。

请帮忙! 谢谢!

【问题讨论】:

    标签: pandas numpy pandas-groupby apply


    【解决方案1】:

    可能不像前一个那么简单,但这是我的尝试。

    grouped = pd.DataFrame(df1.groupby(['memid','year']).aggregate(lambda x: list(x))) grouped.columns = ['_'.join(str(i)) for i in list(grouped.index.values)] grouped = grouped.reset_index(level= 1, drop=True) final = grouped.groupby(grouped.index).aggregate(lambda x: [item for sublist in x for item in sublist])

    【讨论】:

      【解决方案2】:

      这个怎么样:

      grpd_vals = df.pivot_table(
          index='memid',
          columns='year',
          aggfunc=lambda x: ','.join(str(i) for i in x.values)
      ).unstack().to_frame().reset_index()
      

      给予:

      然后构建一个列来保存您的新列名:

      grpd_vals['col'] = grpd_vals['level_0'] + '_'+grpd_vals['year'].astype(str)
      

      然后再分组:

      grpd_vals.pivot_table(
          index='memid',
          columns='col',
          values=0,
          aggfunc=lambda x: x
      )
      

      这给出了:

      【讨论】:

      • 谢谢你的工作!!但是,假设有多行包含空白数据。以 4619,4619,,,,,,,,4619,4619 为例,数据集应该只是将 4619 读取为一个实例,而不是多个实例。
      • 或者,如果你有空值的字符串列,你应该使用i != ''而不是pd.notnull(i)
      • i != '' 成功了!最后一部分是删除重复的条目,例如,如果年份列有多个相同的记录 code1_2014 读取 25003,25003 而我只是希望它是 25003 而不是重复的条目。
      • 请看我上面的评论
      • lambda x: ','.join(set(str(i) for i in x.values if pd.notnull(i))) 将迭代器包装在 set 中将返回唯一值
      猜你喜欢
      • 2017-10-07
      • 2017-04-20
      • 2021-02-28
      • 1970-01-01
      • 2020-02-03
      • 2012-07-31
      • 1970-01-01
      • 2019-07-15
      • 2020-03-24
      相关资源
      最近更新 更多