我有一个panda数据帧和一个列表列表,我希望panda数据框中的每一行在列表中重复多次,并将列表添加为新列。
输入:
期结果:df = pd.DataFrame({'col1':['row1','row2','row3']}) ll = [['a','b'],['a','b','c'],[]]
pd.DataFrame({'col1':['row1','row1','row2','row2','row2','row3'],'col2':['a','b','a','b','c','nan']})
您可以在由
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
如果您希望最后一个单元格为空,可以将其作为列表传递:
df = pd.DataFrame({'col1':['row1','row2','row3']}) ll = [['a','b'],['a','b','c'],[None]] # or np.nan
接下来是zip、product和chain的组合,以便在将ur输出读取为pandas数据帧之前获得它:
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)
使用@Ben.T的解决方案的速度返回:
2.03 ms ± 64.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
使用@umbreon29方法的速度:
460 µs ± 7.41 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
当然,这是一个非常小的数据集。在大型数据集上进行适当的测试应该是更明确的
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'])