Python 如何基于数据帧中的特定行值展开行?

Python 如何基于数据帧中的特定行值展开行?,python,pandas,Python,Pandas,我有一个数据框,如下所示: Col1 Col2 Col3 Col4 AB 2i 2j|2k 2y CD 3j 3k|3p|3e 3x 因此,对于那些具有管道分隔值的行,我希望按如下方式展开这些行:(这应该是最终的数据帧) 因此,必须将管道分隔的值扩展到它们自己的行中,并且必须复制其他字段值。如何在pandas数据框中实现这一点?用于pandas 0.25.0+,用于填充列表的列,然后最后用于默认索引,并使用drop=

我有一个数据框,如下所示:

Col1     Col2     Col3     Col4
AB       2i       2j|2k    2y
CD       3j       3k|3p|3e 3x
因此,对于那些具有管道分隔值的行,我希望按如下方式展开这些行:(这应该是最终的数据帧)

因此,必须将管道分隔的值扩展到它们自己的行中,并且必须复制其他字段值。如何在pandas数据框中实现这一点?

用于pandas 0.25.0+,用于填充列表的列,然后最后用于默认索引,并使用
drop=True

df = df.assign(Col3 = df['Col3'].str.split('|')).explode('Col3').reset_index(drop=True)
print (df)
  Col1 Col2 Col3 Col4
0   AB   2i   2j   2y
1   AB   2i   2k   2y
2   CD   3j   3k   3x
3   CD   3j   3p   3x
4   CD   3j   3e   3x
编辑:如果列名有空格:

print (df)
  Col1 Col2    my col Col4
0   AB   2i     2j|2k   2y
1   CD   3j  3k|3p|3e   3x

df['my col'] = df['my col'].str.split('|')
df = df.explode('my col').reset_index(drop=True)
print (df)
  Col1 Col2 my col Col4
0   AB   2i     2j   2y
1   AB   2i     2k   2y
2   CD   3j     3k   3x
3   CD   3j     3p   3x
4   CD   3j     3e   3x
旧版本的解决方案:

c = df.columns
s = (df.pop('Col3')
       .str.split('|', expand=True)
       .stack()
       .reset_index(drop=True, level=1)
       .rename('Col3'))

df = df.join(s).reset_index(drop=True)[c]
print (df)
  Col1 Col2 Col3 Col4
0   AB   2i   2j   2y
1   AB   2i   2k   2y
2   CD   3j   3k   3x
3   CD   3j   3p   3x
4   CD   3j   3e   3x
用于熊猫0.25.0+,用于填充列表的列,最后用于默认索引,并使用
drop=True

df = df.assign(Col3 = df['Col3'].str.split('|')).explode('Col3').reset_index(drop=True)
print (df)
  Col1 Col2 Col3 Col4
0   AB   2i   2j   2y
1   AB   2i   2k   2y
2   CD   3j   3k   3x
3   CD   3j   3p   3x
4   CD   3j   3e   3x
编辑:如果列名有空格:

print (df)
  Col1 Col2    my col Col4
0   AB   2i     2j|2k   2y
1   CD   3j  3k|3p|3e   3x

df['my col'] = df['my col'].str.split('|')
df = df.explode('my col').reset_index(drop=True)
print (df)
  Col1 Col2 my col Col4
0   AB   2i     2j   2y
1   AB   2i     2k   2y
2   CD   3j     3k   3x
3   CD   3j     3p   3x
4   CD   3j     3e   3x
旧版本的解决方案:

c = df.columns
s = (df.pop('Col3')
       .str.split('|', expand=True)
       .stack()
       .reset_index(drop=True, level=1)
       .rename('Col3'))

df = df.join(s).reset_index(drop=True)[c]
print (df)
  Col1 Col2 Col3 Col4
0   AB   2i   2j   2y
1   AB   2i   2k   2y
2   CD   3j   3k   3x
3   CD   3j   3p   3x
4   CD   3j   3e   3x

对于第一个版本,Col3是否编写时没有qoutes?如果列名有空格怎么办?@SayantanGhosh-答案已编辑,则不能使用assign。@jezrael使用assign优于其他方法有什么好处?@Luiggi-我认为主要是一行代码,但速度较慢,不能使用带空格的列名;)对于第一个版本,Col3是否编写时没有qoutes?如果列名有空格怎么办?@SayantanGhosh-答案已编辑,则不能使用assign。@jezrael使用assign优于其他方法有什么好处?@Luiggi-我认为主要是一行代码,但速度较慢,不能使用带空格的列名;)