【问题标题】:reshape dataframe with various length rows用不同长度的行重塑数据框
【发布时间】:2023-03-16 06:47:01
【问题描述】:

我在 python 中有一个如下所示的数据框:

ID    Value
001   0.5
001   0.2
001   0.5
001   0.0
002   0.4
002   0.6
002   0.6

我希望将数据重新塑造成这样的形式:

ID    Val1    Val2   Val3   Val4
001   0.5     0.2    0.5    0.0
002   0.4     0.6    0.6    NaN

有人可以帮忙吗?我的第一个想法是用“pivot”分解数据,但没有表示“Val”位置的值,它不能按预期工作。

谢谢!

【问题讨论】:

    标签: python python-3.x pandas pandas-groupby


    【解决方案1】:

    通过ID 分组,然后重置索引以保持列一致和取消堆叠

    df.groupby('ID')['Value'].apply(lambda df: df.reset_index(drop=True)).unstack()
          0    1    2    3
    ID
    1   0.5  0.2  0.5  0.0
    2   0.4  0.6  0.6  NaN
    

    或者不使用ID 作为索引:

    df.sort_values('ID').groupby('ID')['Value'].apply(lambda df: df.reset_index(drop=True)).unstack().reset_index()
      ID    0    1    2    3
    0  1  0.5  0.2  0.5  0.0
    1  2  0.4  0.6  0.6  NaN
    

    【讨论】:

      【解决方案2】:

      你可以assign一个索引器系列,然后pivot

      res = df.assign(ValNum=df.groupby('ID').cumcount()+1)\
              .pivot(index='ID', columns='ValNum', values='Value')\
              .reset_index()
      
      print(res)
      
      ValNum  ID    1    2    3    4
      0        1  0.5  0.2  0.5  0.0
      1        2  0.4  0.6  0.6  NaN
      

      【讨论】:

        【解决方案3】:

        这可能有效:

        >>> df = pd.DataFrame({"id": ["001"]*4 + ["002"]*3, "value": [0.5, 0.2, 0.5, 0.0, 0.4, 0.6, 0.6]})
        >>> df
            id  value
        0  001    0.5
        1  001    0.2
        2  001    0.5
        3  001    0.0
        4  002    0.4
        5  002    0.6
        6  002    0.6
        >>> pd.concat([pd.Series(list(g["value"]), name=x) for x, g in df.groupby("id")], axis=1).T
               0    1    2    3
        001  0.5  0.2  0.5  0.0
        002  0.4  0.6  0.6  NaN
        

        现在你要做的是重命名列/行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-11
          • 2023-03-07
          • 2015-10-08
          • 2016-05-25
          相关资源
          最近更新 更多