本文主要是介绍021—pandas 书单整理将同一种书整理在一起,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
在办公自动化场景下,最常见的需求就是信息的整理,pandas 最擅长复杂数据逻辑的处理,能够让整理工作更加高效,同时不容易出错。今天的案例是将一个平铺的书单按品类进行整理,合并为一行。
需求:
- 将书按书名进行合并,比如资本论、大学语文、数据结构 各只保留一个就行
- 增加 备注 列,用于表示书的册数,有三种情况:
- 册名为数字的,如资本论,显示 1-3
- 册名为文字的,如大学语文,显示 上下
- 没有分册的,如数据结构,显示为空
思路:
既然要按书名分组,同时册名要整理在备注中,那我们就要拆书名和册名,这个可以用字符访问器(.str.xx)来操作。
分组后可以用 agg() 来聚合不同的列。
接下来按书名进行分组,作者和 ISBN 编码同组内相同,随便显示其中一个即可,我们可以用 max。
接下来最复杂的就是备注列了,我们可以写一个备注处理的函数来专门处理。
备注列依赖我们将书单列拆分的册名(为了方便后期处理,我们拆分时可以直接叫备注)。这个处理的逻辑是:
- 如果此列全是为空,则显示空字符
- 如果此列全为数字:则输出「列最小-列最大值」这样的合成字符
- 如果以上都不时,就将他们合并起来,这个可以直接用 Series 的 sum,它实现了字符串的拼接
- 理清了以上逻辑,接下来我们就开始编写代码。
二、使用步骤
1.引入库
代码如下(示例):
from io import StringIO
import pandas as pd
2.读入数据
代码如下(示例):
data = '''
书单,作者,ISBN
资本论 1,袁某,23445-2342
资本论 2,袁某,23445-2342
资本论 3,袁某,23445-2342
大学语文 上,李四,a25245-32425
大学语文 下,李四,a25245-32425
数据结构,王某,x342w-ssa
'''df = pd.read_csv(StringIO(data))
df
#给它起列列索引名,赋值为一个新的 DataFrame 备用:
df1 = df.书单.str.split(' ', expand=True)
df1 = df1.set_axis(['书名', '备注'], axis=1)
df1
#将这个拆分的数据合并到原数据中,方便下一步分组:
new_df = pd.concat([df, df1], axis=1)
new_df
#接下来,编写我们提到的备注处理聚合函数(它的参数备注列分组后的一个 Series):
def mark(ser: pd.Series):# 判断是否全为空值if ser.isna().all():return ''# 判断是否全为数字elif ser.str.isdecimal().all():return f'{ser.min()}-{ser.max()}' else:return ser.sum()
#分组,聚合并应用以上函数:
(new_df.groupby('书名', as_index=False, sort=False).agg({'作者': max,'ISBN': max,'备注': mark})
)
#在分组时,我们取消了让分组名成为索引,取消了分组的重新排序,保持与原数据相同的顺序。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
这篇关于021—pandas 书单整理将同一种书整理在一起的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!