在数据框中扩展列表,但包含包含列表的两列

时间:2019-02-09 18:44:17

标签: python pandas

我有一个这样的数据框(但更大):

              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_dnext_p,它们对于每个特定行都具有相同的列表大小。我尝试了各种提示和答案,例如thisthis,但是我需要扩展两个列表而不是一个列表,并且无法想象如何将其应用于我的问题。请帮忙。

2 个答案:

答案 0 :(得分:1)

Seriesconcat一起使用,最后使用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

答案 1 :(得分:0)

首先定义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

请注意,如果next_d中最长的列表是5(根据您的情况), 那么next_d将只替换为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

当然,这是水平扩展。我读完另一个答案后, 我不确定要使用哪个变体(水平或垂直)。