我有一个pandas数据框和一个列表列表,我希望pandas数据框中的每一行在列表中重复多次,然后将该列表添加为新列。
输入:
df = pd.DataFrame({'col1':['row1','row2','row3']}) ll = [['a','b'],['a','b','c'],[]]
col1
0 row1
1 row2
2 row3
预期结果:
pd.DataFrame({'col1':['row1','row1','row2','row2','row2','row3'],'col2':['a','b','a','b','c','nan']})
col1 col2
0 row1 a
1 row1 b
2 row2 a
3 row2 b
4 row2 c
5 row3 nan
答案 0 :(得分:4)
您可以在ll
和reset_index
这样的意甲联赛中尝试explode
,
df = df.join(pd.Series(ll, df.index, name='col2').explode()).reset_index()
print (df)
col1 col2
0 row1 a
1 row1 b
2 row2 a
3 row2 b
4 row2 c
5 row3 NaN
答案 1 :(得分:2)
如果您希望最后一个单元格为空,则可以将其作为列表传递:
def add(self, d):
new_node = Node(d, self.root)
self.root = new_node
self.size += 1
next是zip,product,chain的组合,可以在将您的输出读入pandas数据帧之前获得ur的输出:
df = pd.DataFrame({'col1':['row1','row2','row3']})
ll = [['a','b'],['a','b','c'],[None]] # or np.nan
此速度返回为from itertools import product, chain
res = chain.from_iterable(product([first],last)
for first, last
in zip(df.col1,ll)
)
pd.DataFrame(res)
0 1
0 row1 a
1 row1 b
2 row2 a
3 row2 b
4 row2 c
5 row3 None
返回速度:373 µs ± 9.05 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
使用@ umbreon29的方法加快速度:2.03 ms ± 64.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
当然,这是一个很小的数据集。在大型数据集上进行适当的测试应该更加明确
答案 2 :(得分:1)
IIUC:
rows = ['row1','row2','row3']
ll = [['a','b'],['a','b','c'],[]]
t = []
for r, l1 in zip(rows,ll):
for l2 in l1: t.append([r,l2])
df = pd.DataFrame(t, columns = ['col1','col2'])