看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas 获取列名的特征,在数据预处理、数据分析、特征工程和数据可视化等领域都有广泛的应用。通过利用列名的特征,可以更好地理解数据、进行数据处理和分析,并生成更具描述性和可解释性的结果。
我们的源数据如下:
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)
'''
我们的解决代码如下:
df.set_index('基金名称')
:将 DataFrame 中的列 "基金名称" 设置为索引,创建一个以 "基金名称" 为索引的新 DataFrame。
.apply(lambda x: x.sort_values(ascending=False).to_dict(), axis=1)
:对每一行进行操作,使用 sort_values() 方法对行进行降序排序,并将结果转换为字典形式。这将返回一个 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
'''
.map('、'.join)
:对每个列表进行操作,使用 '、'.join 方法将列表中的字符串连接起来,用 "、" 分隔。这将返回一个以 "、" 分隔的字符串,其中包含所有符合条件的键值对。
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)
'''
使用了新列的 array 结构数据,因为 array 没有标签,否则会涉及标签对齐的问题。
这样就完成了需求。
(完)
更新时间:2024-08-18 16:17:17 标签:pandas python 特征