看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas 的分组大有用处,我们数据处理的大多数场景都是在对数据进行分组,分组产生不同的维度,不同的维度是我们观察数据的不同视角。在本例的数据处理过程中,我们充分利用了数据分组的能力,并使用了 first() 来取非缺失值。
以下是我们的数据:
import pandas as pd
from io import StringIO
pd.__version__
# '1.4.3'
data = '''
code,name,age,weight
1,tom,10,
2,jerry,11,
3,billy,12,
4,carl,13,
5,tom,,60
6,jerry,,62
7,billy,,55
8,carl,,80
'''
df = pd.read_csv(StringIO(data))
df
'''
code name age weight
0 1 tom 10.0 NaN
1 2 jerry 11.0 NaN
2 3 billy 12.0 NaN
3 4 carl 13.0 NaN
4 5 tom NaN 60.0
5 6 jerry NaN 62.0
6 7 billy NaN 55.0
7 8 carl NaN 80.0
'''
原数据 code 1 到 4 和 5 到 8 分为两部分,它们的 name 是相同的,两部分的 name 是相同的,但一个有 age 值,一个有 weight 值。
需求期望只保留第一部分的数据,并将第二部分的 weight 值填充到第一部分。
这类问题,最简单的处理办法是按 name 进行分组,分组后将得到的两个组的值进行处理,两个组的值中一个是 Nan 一个是实值,我们可以利用分组对象的 first() 方法,它能够取到分组中的第一个非 Nan 值的。
对数据进行分组,这里不成为索引,也不重新排序,让数据保持原来的顺序。
(
df.groupby('name', as_index=False, sort=False)
.first()
)
'''
name code age weight
0 tom 1 10.0 60.0
1 jerry 2 11.0 62.0
2 billy 3 12.0 55.0
3 carl 4 13.0 80.0
'''
发现列的顺序不符合要求,使用 reindex() 按原来的数据进行列排序:
(
df.groupby('name', as_index=False, sort=False)
.first()
.reindex(df.columns, axis=1)
)
'''
code name age weight
0 1 tom 10.0 60.0
1 2 jerry 11.0 62.0
2 3 billy 12.0 55.0
3 4 carl 13.0 80.0
'''
另外,还可以通过筛选的方案解决这个问题,大家可以试试哦。
(
df[df.age.notna()]
.assign(weight=df.weight.dropna().values)
)
这样就完成了需求。
(完)
更新时间:Aug. 18, 2024, 4:01 p.m. 标签:pandas 合并 填充