看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
我们知道,pandas 的 explode() 方法可以将数据列表中的每个元素转换为一行,然后复制索引值,但同时其他列的值也会被复制。有时,最终数据我们不需要复制其他列的,如何实现呢?
我们构造数据如下:
import pandas as pd
df = pd.DataFrame([{'a': [1,2,3], 'b': 3, 'c': 222},
{'a': [4,5,6,7], 'b': 3, 'c': 333},
])
df
'''
a b c
0 [1, 2, 3] 3 222
1 [4, 5, 6, 7] 3 333
'''
如果我们用 explode() 方法爆炸 a 列,将得到如下数据:
df.explode('a')
'''
a b c
0 1 3 222
0 2 3 222
0 3 3 222
1 4 3 333
1 5 3 333
1 6 3 333
1 7 3 333
'''
现在需要只保留 b、c 列的第一行数据。
我们还是先对数据 explode() 方法进行爆炸,然后依索引为分组,得到每个子 DataFrame,利用函数将除了第一行的其他数据赋值为 NA,即可完成需求。
先编写一个函数,来处理分组后的子 DataFrame,赋值不需要的数据为 NA,再分组后用 apply() 来应用这个函数,整体代码如下:
def func(d: pd.DataFrame):
d.iloc[1:, 1:] = pd.NA
return d
(
df.explode('a')
.groupby(level=0)
.apply(func)
)
'''
a b c
0 1 3 222
0 2 <NA> <NA>
0 3 <NA> <NA>
1 4 3 333
1 5 <NA> <NA>
1 6 <NA> <NA>
1 7 <NA> <NA>
'''
本例中需要掌握的知识点有:
explode()
默认后复制索引和其他列,这些都可以用来分组groupby()
对索引进行分组可以传入 level=0
iloc[]
选择再进行赋值你理解了吗?
(完)
更新时间:2024-08-18 16:06:43 标签:pandas python 爆炸