抛弃你的Excel吧,5行Python代码快速处理合并单元格

在日常处理数据的过程中,我们经常遇到带有合并单元格的excel文件,或者带有空值的csv文件,使用excel打开后如下图所示,但这对数据分析是很不友好的,作为一个Data Analyst,看到这么糟心的数据,怎么能忍?赶紧掏出万能的Pandas来tidy data!

带有合并单元格的数据

需求分析:想要根据哪一列的粒度整理数据?

  1. 如果是class_id这一列,则整理后的结果将成为4行,同一个class_id下的student_list将会被合并到一个单元格内,可以考虑使用,将不同的元素隔开
  2. 如果是student_list这一列,则整理后的结果将成为8行,有合并单元格的列将会被拆分开来,且在有空值的位置补上对应的正确的值

处理步骤

准备工作

  • 用到的库:pandas
  • 用到的函数:fillna(),groupby(),agg(),merge()

1.读取数据

可以看到将数据读取到DataFrame后,在有合并单元格的列中,将会有值为NaN的单元格出现

# 引入 pandas 库
import pandas as pd
# 读取样例数据,这里读取的是 csv 数据
df = pd.read_csv("../data/test.csv")

测试数据集

2.寻找主键列并为空值单元格填充数据

需要先找出一个没有重复值且带有合并单元格组合列,也叫主键联合主键,通过以下代码将只为空的单元格进行填充。本例以class_id列为例。

df['class_id'] = df['class_id'].fillna(method='ffill')

可以看到class_id这一列的空值已被填充,且产生了重复值。
为主键空值单元格填充数据
如果你是需求分析中的需求2,那么到这一步其实已经接近最终结果了,你可以采用同样的方法将其他两列的空值进行填充,或者对多个列同时进行空值填充:df = df[['class_id', 'class_name', 'remark']].fillna(method='ffill')
如果你是需求分析中的需求1,那么请继续以下步骤。

3.对数据进行分组

本步骤需要对没有合并单元格的列根据上一步中所使用的列进行分组,并将组内的数据使用, 连接起来。本例中使用的没有合并单元格的列是student_list列。可以看到示例数据集已经被根据class_id分为4组,且各组内的student_list元素已分别被, 连接起来放到一个单元格中,新生成的 df_student数据集的索引是class_id

df_student = df.groupby('class_id').agg({"student_list": ', '.join})

对数据进行分组

4.去除带有空值的行

此步需要对原数据进行中带有空值的行去掉,并将student_list列丢弃。

丢弃student_list列的原因是:在上一步已经生成了一个新的数据集df_student,这个数据集中的student_list列才是我们想要的数据

# axis=0 代表去除带有一个或多个空值的行,对应的 axis=1 代表去除带有一个或多个空值的列,本例中我们需要去除带有空值的行
df = df.dropna(axis=0).drop('student_list', axis=1)

去除带有空值行的数据集

5.合并数据集

此步骤将上述步骤中产生的两个数据集dfdf_student进行合并,得到最终想要的结果集。

# 采用 merge() 函数将 df 和 df_student 根据 class_id 进行左连接合并数据
# left_on='class_id' 代表 df 采用 class_id 作为连接条件
# right_index=True 代表 df_student 将索引作为连接条件
df = pd.merge(df, df_student, how='left', left_on='class_id', right_index=True, copy=False)

最终结果集

补充:数据连接示意图

数据连接示意图

如果你觉得此文对你有帮助,请记得 点赞 收藏 + 关注 哦

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年7月6日
下一篇 2023年7月6日

相关推荐