看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
数据处理中,按行排列的列名可以提供更直观的数据探索和分析方式。你可以逐行查看列名,了解每列的含义和特征,有助于更好地理解数据集的结构和内容。
我们的源数据及构造代码如下:
import io
import pandas as pd
data = '''
基金名称 电子 传媒 计算机
基金A 1 6 7
基金B 0 3 8
基金C 7 0 9
'''
df = pd.read_csv(io.StringIO(data), sep=r'\s+')
df
# ...
需要增加一列「分布方式」,每行的值是本行基金名称对应列名及数量,顺序按照值大小,值为 0 的不显示,即:
'''
基金名称
基金A 计算机(7)、传媒(6)、电子(1)
基金B 计算机(8)、传媒(3)
基金C 计算机(9)、电子(7)
dtype: object
'''
先用 apply() 按行,将构成每行 Series 转为字典,这时字典的键为列名,值为数值。
接着用列表推导式过滤值为 0 的项,得到一个列表。
再用 join() 方法用顿号 、
将列表的所有项连接起来。
最后将得到的结果指定为一个列。
先设置基金名称为索引,这时基金名称就不参加行的计算,仅值进行计算。用 apply() 按行将每行 Series 进行排序,最后转为字典:
(
df.set_index('基金名称')
.apply(lambda x: x.sort_values(ascending=False).to_dict(), axis=1)
)
'''
基金名称
基金A {'计算机': 7, '传媒': 6, '电子': 1}
基金B {'计算机': 8, '传媒': 3, '电子': 0}
基金C {'计算机': 9, '电子': 7, '传媒': 0}
dtype: object
'''
通过列表推导式,将值为 0 的过滤,得到列表:
(
df.set_index('基金名称')
.apply(lambda x: x.sort_values(ascending=False).to_dict(), axis=1)
.map(lambda x: [f'{k}({v})' for k,v in x.items() if v>0])
)
'''
基金名称
基金A [计算机(7), 传媒(6), 电子(1)]
基金B [计算机(8), 传媒(3)]
基金C [计算机(9), 电子(7)]
dtype: object
'''
用中文顿号连接列表的项:
col = (
df.set_index('基金名称')
.apply(lambda x: x.sort_values(ascending=False).to_dict(), axis=1)
.map(lambda x: [f'{k}({v})' for k,v in x.items() if v>0])
.map('、'.join)
)
col
'''
基金名称
基金A 计算机(7)、传媒(6)、电子(1)
基金B 计算机(8)、传媒(3)
基金C 计算机(9)、电子(7)
dtype: object
'''
将得到的列值指定到数据中:
df.assign(行业分布=col.array)
'''
基金名称 电子 传媒 计算机 行业分布
0 基金A 1 6 7 计算机(7)、传媒(6)、电子(1)
1 基金B 0 3 8 计算机(8)、传媒(3)
2 基金C 7 0 9 计算机(9)、电子(7)
'''
这样就得到了最终的结果。
(完)
更新时间:Aug. 18, 2024, 4:17 p.m. 标签:pandas python 排序