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]]
答案 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]