[英]Split pandas dataframe column string with multiple values into separate rows
[英]Split pandas dataframe string into separate rows
我有一个 dataframe 文本字符串,它基本上代表每行一个或多个旅程。 我试图分开旅程的两条腿,这样我就可以单独看到它们。 示例输入 dataframe 如下所示:
更新:
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
我试图得到的 output 应该如下所示。 因此,对于第一个示例,旅程航段是A to A1 then A1 to x then x to y and then y to 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
有人可以帮忙吗?
谢谢
尝试这个。
EDIT
:根据@Ben.T的建议进行了更改。
df = pd.concat([df.rename(columns={'var2': 'var2old'}),
df.var2.str.split('/').explode()],
axis=1, join='outer')
## CREDIT: @Ben.T
df['var1'] = df['var1'].where(df['var1'].ne(df['var1'].shift()), df['var2'].shift())
print(df)
Output :
var1 var2old var3 var2
0 A x/y/z abc1 x
0 x x/y/z abc1 y
0 y x/y/z abc1 z
1 B xx/yy abc2 xx
1 xx xx/yy abc2 yy
2 c zz abcd zz
OP最初发布的数据(问题的原始海报)。
import pandas as pd
df = pd.DataFrame([{'var1':'A', 'var2':'x/y/z', 'var3':'abc1'},
{'var1':'B', 'var2':'xx/yy', 'var3':'abc2'},
{'var1':'c', 'var2':'zz', 'var3':'abcd'}])
尝试explode
df=df_input.assign(var2=df_input.var2.str.split('/')).explode('var2')
var1 var2 var3
0 A x abc1
0 A y abc1
0 A z abc1
1 B xx abc2
1 B yy abc2
2 c zz abcd
然后groupby
+ shift
df.var1=df.groupby(level=0).var2.shift().fillna(df.var1)
df
var1 var2 var3
0 A x abc1
0 x y abc1
0 y z abc1
1 B xx abc2
1 xx yy abc2
2 c zz abcd
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.