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-我认为主要是一行代码,但速度较慢,不能使用带空格的列名;)