有没有一种方法可以通过python pandas中的运算来对组进行逆运算?

时间:2020-05-09 02:49:43

标签: python pandas dataframe

我有一个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

3 个答案:

答案 0 :(得分:4)

您可以在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

答案 1 :(得分:2)

如果您希望最后一个单元格为空,则可以将其作为列表传递:

        def add(self, d):
            new_node = Node(d, self.root)
            self.root = new_node
            self.size += 1

next是zip,productchain的组合,可以在将您的输出读入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

使用@ Ben.T的解决方案

返回速度: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'])