有没有一种方法可以在蟒蛇熊猫身上通过运算来实现组的逆运算



我有一个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']})

您可以在由llreset_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'])

最新更新