在pandas 版本0.25.0 中出现了series 和dataframes 的新方法'explode'。旧版本没有这种方法。
它有助于构建您需要的结果。
例如你有这样的系列:
import pandas as pd
s = pd.Series([
['slim', 'waist', 'man'],
['slim', 'waistline'],
['santa']])
然后就可以使用了
s.explode()
要得到这样的结果:
0 slim
0 waist
0 man
1 slim
1 waistline
2 santa
如果是数据框:
df = pd.DataFrame({
's': pd.Series([
['slim', 'waist', 'man'],
['slim', 'waistline'],
['santa']
]),
'a': 1
})
你会有这样的DataFrame:
s a
0 [slim, waist, man] 1
1 [slim, waistline] 1
2 [santa] 1
在s 列上应用爆炸:
df.explode('s')
会给你这样的结果:
s a
0 slim 1
0 waist 1
0 man 1
1 slim 1
1 waistline 1
2 santa 1
如果您的系列包含空列表
import pandas as pd
s = pd.Series([
['slim', 'waist', 'man'],
['slim', 'waistline'],
['santa'],
[]
])
然后运行 explode 将为空列表引入 NaN 值,如下所示:
0 slim
0 waist
0 man
1 slim
1 waistline
2 santa
3 NaN
如果不想这样,可以dropna方法调用:
s.explode().dropna()
要得到这个结果:
0 slim
0 waist
0 man
1 slim
1 waistline
2 santa
Dataframes 也有dropna 方法:
df = pd.DataFrame({
's': pd.Series([
['slim', 'waist', 'man'],
['slim', 'waistline'],
['santa'],
[]
]),
'a': 1
})
在没有 dropna 的情况下运行 explode:
df.explode('s')
将导致:
s a
0 slim 1
0 waist 1
0 man 1
1 slim 1
1 waistline 1
2 santa 1
3 NaN 1
使用dropna:
df.explode('s').dropna(subset=['s'])
结果:
s a
0 slim 1
0 waist 1
0 man 1
1 slim 1
1 waistline 1
2 santa 1