代码之家  ›  专栏  ›  技术社区  ›  Michael

展开数据帧中的列表,但包含列表的两列[重复]

  •  1
  • Michael  · 技术社区  · 5 年前

    我有一个这样的数据框架(但要大得多):

                  begin        end   comp  p_n             next_d                        next_p
    c_n   ml                                                                                                                                                   
    1   1234 2013-09-02 2014-12-16  comp1  111 [20000, 25000, 50000]               [0.01, 0.01, 0.01]
        1235 2013-09-02 2014-12-16  comp2  222 [25000, 50000, 75000, 100000]       [0.1, 0.1, 0.1, 0.1]
    2   1236 2013-09-02 2014-12-16  comp3  333 [5000, 10000, 15000, 170000, 25000] [0.1, 0.1, 0.1, 0.1, 0.1]
        1237 2013-09-02 2014-12-16  comp4  444 [5000, 10000, 25000, 50000]         [0.01, 0.01, 0.01, 0.01]
    

    我两个都要扩大 next_d next_p 每个特定行的列表大小相同。我尝试过各种提示和答案,例如, this this 但是我需要扩展两个列表而不是一个,并且无法想象如何将其应用于我的问题。请帮忙。

    2 回复  |  直到 5 年前
        1
  •  1
  •   jezrael    5 年前

    一列两列都使用解决方案 Series , concat 一起到最后 join :

    s1 = pd.DataFrame(df.pop('next_d').values.tolist(), 
                       index=df.index).stack().rename('next_d').reset_index(level=2, drop=True)
    s2 = pd.DataFrame(df.pop('next_p').values.tolist(), 
                       index=df.index).stack().rename('next_p').reset_index(level=2, drop=True)
    
    df = df.join(pd.concat([s1, s2], axis=1))
    print (df)
                   begin         end   comp  p_n    next_d  next_p
    c_n ml                                                        
    1   1234  2013-09-02  2014-12-16  comp1  111   20000.0    0.01
        1234  2013-09-02  2014-12-16  comp1  111   25000.0    0.01
        1234  2013-09-02  2014-12-16  comp1  111   50000.0    0.01
        1235  2013-09-02  2014-12-16  comp2  222   25000.0    0.10
        1235  2013-09-02  2014-12-16  comp2  222   50000.0    0.10
        1235  2013-09-02  2014-12-16  comp2  222   75000.0    0.10
        1235  2013-09-02  2014-12-16  comp2  222  100000.0    0.10
    2   1236  2013-09-02  2014-12-16  comp3  333    5000.0    0.10
        1236  2013-09-02  2014-12-16  comp3  333   10000.0    0.10
        1236  2013-09-02  2014-12-16  comp3  333   15000.0    0.10
        1236  2013-09-02  2014-12-16  comp3  333  170000.0    0.10
        1236  2013-09-02  2014-12-16  comp3  333   25000.0    0.10
        1237  2013-09-02  2014-12-16  comp4  444    5000.0    0.01
        1237  2013-09-02  2014-12-16  comp4  444   10000.0    0.01
        1237  2013-09-02  2014-12-16  comp4  444   25000.0    0.01
        1237  2013-09-02  2014-12-16  comp4  444   50000.0    0.01
    
        2
  •  0
  •   Valdi_Bo    5 年前

    首先定义2个函数,稍后使用:

    def createList(lst, lgth):
        return lst + [None] * (lgth - len(lst))
    
    def createNames(name, lgth):
        return [ f'{name}_{i}' for i in range(1, lgth + 1) ]
    

    然后计算最大长度 next_d :

    maxLen = max(df.next_d.apply(len)); maxLen
    

    请注意,如果 NEXSTD 例如5(如您的情况), 然后 NEXSTD 将只替换为5个新列,同样适用于 next_p .

    然后计算“扩展数组”(仅新列):

    df2 = df.apply(lambda row: createList(row['next_d'], maxLen) +
        createList(row['next_p'], maxLen), axis=1, result_type='expand')
    df2.columns = createNames('next_d', maxLen) + createNames('next_p', maxLen)
    

    最后要做的两件事是:

    • 删除两个原始列,
    • 加入新的列。

      df=df.drop(columns=['next_d','next_p']).join(df2)

    现在你可以下车了 df2 :

    del df2
    

    当然,这是 水平的 膨胀。在我读到另一个答案之后, 我不知道你想要哪种变体(水平的还是垂直的)。