【问题标题】:reshape pandas data frame: duplicated rows to columns, with textual data重塑熊猫数据框:将行复制到列,带有文本数据
【发布时间】:2022-11-25 03:36:16
【问题描述】:

我有一个这样的数据框:

INDEX_COL                col1
A                        Random Text 
B                        Some more random text
C                        more stuff
A                        Blah
B                        Blah, Blah
C                        Yet more stuff
A                        erm
B                        yup
C                        whatever

我需要的是将其改造成新列并按 col_1 中的值堆叠/分组。所以像这样:

A                               B                              C
Random Text                     Some more random text          more stuff
Blah                            Blah, Blah                     Yet more stuff
erm                             yup                            whatever

我试过以下方法:

Pivot - 但我见过的所有示例都涉及带有聚合函数的数值。这是重塑非数值数据

我得到 index=INDEX COL,并且 columns='col1',但是值?添加一个数字列,旋转然后删除创建的数字列?感觉就像尝试强制枢轴做一些它从未打算做的事情。

Unstack - 但这似乎将 df 转换为具有单值索引“b”的新 df

unstack(level=0)

我什至考虑过按索引将数据帧切片为单独的数据帧并将它们连接起来,但不匹配的索引导致 NaN 看起来像棋盘。这也感觉像是一个错误的解决方案。

我尝试删除 index_col,其中 Col1=['A,B,C'] 和 col2= 随机文本,但新的整数索引出现并破坏了乐趣。

我应该朝哪个方向发展有什么建议或想法吗?

【问题讨论】:

    标签: python pandas dataframe data-wrangling


    【解决方案1】:

    您可以使用 agg(list) 然后使用 explode 整个数据框:

    output =  df.groupby('INDEX_COL').agg(list).T.apply(pd.Series.explode)
    

    输出:

    INDEX_COL   A          B                        C
    col1    Random Text   Some more random text   more stuff
    col1    Blah          Blah, Blah         Yet more stuff
    col1    erm              yup               whatever
    

    【讨论】:

      【解决方案2】:

      如果 'INDEX_COL' 在数据帧索引中,试试这个:

      df.set_index(df.groupby(level=0).cumcount(), append=True)['col1'].unstack(0)
      

      输出:

      INDEX_COL            A                      B               C
      0          Random Text  Some more random text      more stuff
      1                 Blah             Blah, Blah  Yet more stuff
      2                  erm                    yup        whatever
      

      否则,先df = df.set_index('INDEX_COL')

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多