我有一个文本字符串的数据框架,它基本上代表每行一个或多个行程。 我试着把旅程的两条腿分开,这样我就可以单独看到它们了。 示例输入数据帧如下所示:
df_input = pd.DataFrame([{'var1':'A/A1', 'var2':'x/y/z', 'var3':'abc1'},
{'var1':'B', 'var2':'xx/yy', 'var3':'abc2'},
{'var1':'c', 'var2':'zz', 'var3':'abcd'}])
var1 var2 var3
0 A/A1 x/y/z abc1
1 B xx/yy abc2
2 c zz abcd
我试图获得的输出应该如下所示。 因此,对于第一个示例,旅程段是A到A1,然后A1到x,然后x到y,然后y到Z
。 如果还有一种方法可以添加一个额外的列来指示旅程段号(1,2,3等),那将非常有用。 var3
在这里并不重要,但我只是将它包括在内,以表明在拆分行时还有其他列会重复。
df_output = pd.DataFrame([{'var1': 'A', 'var2': 'A1', 'var3':'abc1'},
{'var1': 'A1', 'var2': 'x', 'var3':'abc1'},
{'var1': 'x', 'var2': 'y', 'var3':'abc1'},
{'var1': 'y', 'var2': 'z', 'var3':'abc1'},
{'var1': 'B', 'var2': 'xx', 'var3':'abc2'},
{'var1': 'xx', 'var2': 'yy', 'var3':'abc2'},
{'var1': 'c', 'var2': 'zz', 'var3':'abcd'}])
var1 var2 var3
0 A A1 abc1
1 A1 x abc1
2 x y abc1
3 y z abc1
4 B xx abc2
5 xx yy abc2
6 c zz abcd
谁能帮帮忙吗? 我在前面发布了一个类似的(更简单的)问题,但是由于复杂性增加了,并且这里的解决方案不适用于var1
和var2
都有由/
分隔的多个条目的场景,所以重新发布。
谢谢
以下是从join
+explode
然后shift
的一种方法
df_input['New']=df_input[['var1','var2']].agg('/'.join,1).str.split('/')
df=df_input.explode('New')
df['New2']=df.groupby(level=0).New.shift(-1)
df=df.dropna(subset=['New2'],axis=0)
df
var1 var2 var3 New New2
0 A/A1 x/y/z abc1 A A1
0 A/A1 x/y/z abc1 A1 x
0 A/A1 x/y/z abc1 x y
0 A/A1 x/y/z abc1 y z
1 B xx/yy abc2 B xx
1 B xx/yy abc2 xx yy
2 c zz abcd c zz