在 pandas 版本
0.25.0
中,出现了一个新的方法“explode”,适用于
series 和
dataframes。旧版本中没有此方法。
它有助于构建所需的结果。
例如,您有这样的 series:
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
})
你将拥有这样的数据框:
s a
0 [slim, waist, man] 1
1 [slim, waistline] 1
2 [santa] 1
在 s
列上应用 explode 函数:
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
})
使用 explode
而不带有 dropna 参数:
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