如何重复/扩展熊猫数据框?

时间:2021-07-12 22:35:41

标签: python pandas dataframe numpy

我想根据序列的长度扩展/重复行数。例如:

import pandas as pd 
df = pd.DataFrame({"id":[11,12], "seq":['A,B,C', 'A,B,C,D'], "y":[1, 5]})
print(df)

   id      seq  y
0  11    A,B,C  1
1  12  A,B,C,D  5

我希望这个 df 是

   id      seq     y
0  11      A       1
1  11      A,B     1
2  11      A,B,C   1
3  12      A       5
4  12      A,B     5
5  12      A,B,C   5
6  12      A,B,C,D 5

有什么建议吗? 谢谢

3 个答案:

答案 0 :(得分:1)

您可以在列表推导式中收集每个 seq 字符串的奇数长度前缀,然后在这些列表上分解数据框:

df['seq'] = df.seq.apply(lambda s: [s[:i] for i in range(1, len(s)+1, 2)])
df = df.explode('seq')
df.reset_index(drop=True)
    id  seq      y
0   11  A        1
1   11  A,B      1
2   11  A,B,C    1
3   12  A        5
4   12  A,B      5
5   12  A,B,C    5
6   12  A,B,C,D  5

答案 1 :(得分:1)

首先,拆分和爆炸以获得新行:

df['seq1'] = df['seq'].str.split(',')
df = df.explode('seq1')

然后以组为单位,对每个序列进行值的累积附加。然后拆分并加入它们,同时去除由于拆分而​​出现的前导和尾随逗号。

df['l'] = df.groupby('id')['seq1'].apply(
    lambda s: s.cumsum().str.split('').str.join(',').str.strip(','))

因此,

>>> df
   id      seq  y seq1        l
0  11    A,B,C  1    A        A
0  11    A,B,C  1    B      A,B
0  11    A,B,C  1    C    A,B,C
1  12  A,B,C,D  5    A        A
1  12  A,B,C,D  5    B      A,B
1  12  A,B,C,D  5    C    A,B,C
1  12  A,B,C,D  5    D  A,B,C,D

答案 2 :(得分:1)

另一种选择是在 groupby expanding 之后使用 explode

df['seq'] = df['seq'].str.split(',')
df = df.explode('seq')
df['seq'] = [','.join(ewv) for ewv in df.groupby(level=0).expanding()['seq']]
df = df.reset_index(drop=True)

df

   id      seq  y
0  11        A  1
1  11      A,B  1
2  11    A,B,C  1
3  12        A  5
4  12      A,B  5
5  12    A,B,C  5
6  12  A,B,C,D  5