前言
数据处理中,按行排列的列名可以提供更直观的数据探索和分析方式。
你可以逐行查看列名,了解每列的含义和特征,有助于更好地理解数据集的结构和内容。
需求:
- 需要增加一列「分布方式」,每行的值是本行基金名称对应列名及数量,顺序按照值大小,值为 0 的不显示
思路:
- 先用 apply() 按行,将构成每行 Series 转为字典,这时字典的键为列名,值为数值。
- 接着用列表推导式过滤值为 0 的项,得到一个列表。
- 再用 join() 方法用顿号 、 将列表的所有项连接起来。
- 最后将得到的结果指定为一个列。
使用步骤
读入数据
代码如下(示例):
mport 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), delim_whitespace=True) #通过指定delim_whitespace=True参数来指示使用空格作为分隔符
df
# 代码:
# 先设置基金名称为索引,这时基金名称就不参加行的计算,仅值进行计算。
# 用 apply() 按行将每行 Series 进行排序,最后转为字典:
(
df.set_index('基金名称')
.apply(lambda x: x.sort_values(ascending=False).to_dict(), axis=1) #对每个基金的投资分布按照降序排序,并转换成字典的形式
)
# 通过列表推导式,将值为 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])
)
# 用中文顿号连接列表的项:
# 使用map()函数将每个Series对象中的字符串用'、'连接起来,形成一个新的字符串
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
# 将得到的列值指定到数据中:
df.assign(行业分布=col.array) # col.array表示将列数据以数组的形式添加到DataFrame对象中
总结
以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。