explode
方法结合str.split:
首先使用str.split
方法将'b'列的字符串按逗号分隔为列表,然后用explode
方法将这些列表拆分为多行
import pandas as pd
data = {'a': [1, 2, 3],
'b': ['x,y,z', 'p,q', 'r,s,t,u']}
df = pd.DataFrame(data)
# 将'b'列的字符串拆分为列表,并使用explode方法将其拆分为多行
df['b'] = df['b'].str.split(',')
df = df.explode('b')
# 重置索引以删除多余的行
df = df.reset_index(drop=True)
print(df)
'''
a b
0 1 x
1 1 y
2 1 z
3 2 p
4 2 q
5 3 r
6 3 s
7 3 t
8 3 u
'''
explode
方法:
Pandas中,explode
方法用于将DataFrame中的可迭代对象的列元素拆分成多行。如果某列包含可迭代对象(如列表、元组等),explode
方法会为这些可迭代对象中的每个元素创建新的行,同时保留其他列的值。
如果某列列包含的是不可迭代对象,如普通字符串,则不能直接使用explode,
可以先使用str.split
方法将字符串拆分为列表,然后再使用explode
方法。
彩蛋:
在拆分b列的同时增加一个c列,其内容为b列字符串拆分成列表后对应的索引:
str.split
+ explode
+ groupby.
cumcount
import pandas as pd
data = {'a': [1, 2, 3],
'b': ['x,y,z', 'p,q', 'r,s,t,u']}
df = pd.DataFrame(data)
# 链式操作
df = (df.assign(b=df['b'].str.split(',')) # 拆分字符串为列表
.explode('b') # 爆炸列表为多行
.assign(c=lambda x: x.groupby('a').cumcount())) # 添加累积计数
print(df)
'''
a b c
0 1 x 0
0 1 y 1
0 1 z 2
1 2 p 0
1 2 q 1
2 3 r 0
2 3 s 1
2 3 t 2
2 3 u 3
'''