如何将列表中的元素逐个附加到数据框中的嵌套列表中

时间:2018-03-28 20:56:38

标签: python list pandas

import pandas as pd

d = {'A': [1,2,3,4], 'B': [[[1,2],[2,3]],[[3,4],[2,5]],[[5,6],[5,6],[5,6]],[7,8]]}

df = pd.DataFrame(data=d)

C = [1,2,3,4,5,6,7,8]

我有一个pandas数据帧,并希望将C列表的每个元素附加到B的每个嵌套列表中,维护结构,以便生成的数据帧为:

'A': [1,2,3,4]
'B': [[[1,2,1],[2,3,2]],[[3,4,3],[2,5,4]],[[5,6,5],[5,6,6],[5,6,7]],[7,8,8]]

3 个答案:

答案 0 :(得分:3)

Mybe有一个更优雅的解决方案,但这有效: - )

for i in d['B']:
    for j in i:
        if (isinstance(j, list)):
            j.append(C.pop(0))
        else:
            i.append(C.pop(0))
            break

基于timgebs评论的更有效的解决方案(谢谢!):

f = iter(C)
for i in d['B']:
    for j in i:
        if (isinstance(j, list)):
            j.append(next(f))
        else:
            i.append(next(f))
            break

答案 1 :(得分:2)

这是使用itertools的替代方法。

我们的想法是压缩列表列表,附加数据,然后通过存储在每行列表数中的信息再次拆分。

from itertools import chain, accumulate
import pandas as pd

d = {'A': [1,2,3,4], 'B': [[[1,2],[2,3]],[[3,4],[2,5]],[[5,6],[5,6],[5,6]],[[7,8]]]}
df = pd.DataFrame(data=d)
C = [1,2,3,4,5,6,7,8]

acc = [0] + list(accumulate(map(len, B)))

lst = [j+[C[i]] for i, j in enumerate(chain.from_iterable(df['B']))]

df['B'] = [lst[x:y] for x, y in zip(acc, acc[1:])]

注意我对输入进行了重要更改:系列B的最后一个元素是列表列表,就像所有其他元素一样。为了保持一致性,无论如何我都会推荐这个。

<强>结果

   A                                  B
0  1             [[1, 2, 1], [2, 3, 2]]
1  2             [[3, 4, 3], [2, 5, 4]]
2  3  [[5, 6, 5], [5, 6, 6], [5, 6, 7]]
3  4                        [[7, 8, 8]]

答案 2 :(得分:0)

d = {'A': [1,2,3,4], 'B': [[[1,2],[2,3]],[[3,4],[2,5]],[[5,6],[5,6],[5,6]],[7,8]]}

df = pd.DataFrame(data=d)

C = [1,2,3,4,5,6,7,8]

df['B_len'] = df.B.apply(len)
df['B_len_cumsum']=df.B_len.cumsum()
df['C'] = df.apply(lambda row: C[row['B_len_cumsum']-row['B_len']:row['B_len_cumsum']], axis=1)
df['B'] = df.B.apply(lambda x: [x] if type(x[0])==int else x)
for x,y in zip(df.B,df.C):
        for xx,yy in zip(x,y):
            xx.append(yy)
df

输出:

   A                                  B  B_len  B_len_cumsum          C
0  1             [[1, 2, 1], [2, 3, 2]]      2             2     [1, 2]
1  2             [[3, 4, 3], [2, 5, 4]]      2             4     [3, 4]
2  3  [[5, 6, 5], [5, 6, 6], [5, 6, 7]]      3             7  [5, 6, 7]
3  4                        [[7, 8, 8]]      2             9        [8]