我想根据序列的长度扩展/重复行数。例如:
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
有什么建议吗? 谢谢
答案 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