在日常处理数据的过程中,我们经常遇到带有合并单元格的excel文件,或者带有空值的csv文件,使用excel打开后如下图所示,但这对数据分析是很不友好的,作为一个Data Analyst,看到这么糟心的数据,怎么能忍?赶紧掏出万能的Pandas来tidy data!
class_id
这一列,则整理后的结果将成为4行
,同一个class_id
下的student_list
将会被合并到一个单元格内,可以考虑使用,
将不同的元素隔开student_list
这一列,则整理后的结果将成为8
行,有合并单元格的列将会被拆分开来,且在有空值的位置补上对应的正确的值pandas
fillna()
,groupby()
,agg()
,merge()
可以看到将数据读取到DataFrame后,在有合并单元格的列中,将会有值为NaN
的单元格出现
# 引入 pandas 库
import pandas as pd
# 读取样例数据,这里读取的是 csv 数据
df = pd.read_csv("../data/test.csv")
需要先找出一个没有重复值且带有合并单元格的列
或组合列
,也叫主键
或联合主键
,通过以下代码将只为空的单元格进行填充。本例以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
,那么请继续以下步骤。
本步骤需要对没有合并单元格的列根据上一步中所使用的列进行分组,并将组内的数据使用,
连接起来。本例中使用的没有合并单元格的列是student_list
列。可以看到示例数据集已经被根据class_id
分为4组,且各组内的student_list
元素已分别被,
连接起来放到一个单元格中,新生成的 df_student
数据集的索引是class_id
。
df_student = df.groupby('class_id').agg({"student_list": ', '.join})
此步需要对原数据进行中带有空值的行去掉,并将student_list
列丢弃。
丢弃
student_list
列的原因是:在上一步已经生成了一个新的数据集df_student
,这个数据集中的student_list
列才是我们想要的数据
# axis=0 代表去除带有一个或多个空值的行,对应的 axis=1 代表去除带有一个或多个空值的列,本例中我们需要去除带有空值的行
df = df.dropna(axis=0).drop('student_list', axis=1)
此步骤将上述步骤中产生的两个数据集df
和df_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)
如果你觉得此文对你有帮助,请记得 点赞 收藏 + 关注 哦