看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本案例中,每个品名有它对应的属性名称和属性值域,想让每个品名的属性名称和属性值域,由列转置成行,并且每一个品名由它对应的属性。我们来看看如何用 pandas 完成这个需求。
数据构造代码如下:
import pandas as pd
data = {
'序号': [1, 1, 1, 2, 2, 3, 3, 3],
'品名': ['金属', '金属', '金属', '其他产品',
'其他产品', '塑料', '塑料', '塑料'],
'属性名称': ['品牌', '基准计量单位', '其他属性', '品牌',
'基准计量单位', '品牌', '规格', '基准计量单位'],
'属性值域': [pd.NA, 'm', '其他值', '其他品牌',
'cm', pd.NA, pd.NA, 'cm']
}
df = pd.DataFrame(data)
df
'''
序号 品名 属性名称 属性值域
0 1 金属 品牌 <NA>
1 1 金属 基准计量单位 m
2 1 金属 其他属性 其他值
3 2 其他产品 品牌 其他品牌
4 2 其他产品 基准计量单位 cm
5 3 塑料 品牌 <NA>
6 3 塑料 规格 <NA>
7 3 塑料 基准计量单位 cm
'''
得到的最终结果如下:
'''
序号 品名 属性名称1 属性名称2 属性名称3
0 1 金属 品牌 基准计量单位 其他属性
1 1 金属 <NA> m 其他值
2 2 其他产品 品牌 基准计量单位 NaN
3 2 其他产品 其他品牌 cm NaN
4 3 塑料 品牌 规格 基准计量单位
5 3 塑料 <NA> <NA> cm
'''
先按序号和品名分组,得到一个分组对象,用 apply 来应用这个分组对象,对每个子 DataFrame 进行处理,将索引重置后转置,它会将三个组拼接进来,再重置索引,删除多余和列,就得到了最终的效果。
根据思路,最终代码如下:
(
df.groupby(['序号', '品名'], sort=False, as_index=True)
.apply(lambda d: d.reset_index(drop=True)
.rename(index=lambda x: f'属性名称{x+1}')
.T,
include_groups=False)
.reset_index()
.drop('level_2', axis=1)
)
这样就完成了需求。
(完)
更新时间:Aug. 18, 2024, 4:27 p.m. 标签:pandas python 分组 列转行