我有一个这样的数据框(但更大):
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,但是我需要扩展两个列表而不是一个列表,并且无法想象如何将其应用于我的问题。请帮忙。
答案 0 :(得分:1)
将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
答案 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
当然,这是水平扩展。我读完另一个答案后, 我不确定要使用哪个变体(水平或垂直)。