pandas数据的合并与拼接的实现
在数据分析的过程中,数据的合并与拼接是非常常见的需求。因为往往我们需要将多个数据源的数据整合到一起来进行分析与处理。在pandas库中,提供了多种方法来实现数据合并与拼接,包括concat、merge等。
concat拼接
在讲解具体使用之前,我们先介绍一下concat函数。concat函数可以将一组pandas对象(DataFrame或Series)按照指定的轴连接起来,生成一个新的pandas对象。其竖直合并数据的方法可以通过concat形式拼接,常见的形式有:
pd.concat([df1, df2], axis=0)
其中,参数axis=0表示竖直合并数据。而在横向合并数据时,可以设置axis=1,如:
pd.concat([df1, df2], axis=1)
接下来,我们通过两个具体的示例来说明concat函数的使用方法:
示例1
假设我们有两个DataFrame,一个包含学生的考试成绩,另一个包含学生的个人信息。现在我们要将这两个DataFrame按照学生的姓名进行拼接。具体代码如下:
import pandas as pd
# 创建考试成绩数据
data1 = {'name': ['张三', '李四', '王五', '赵六'], 'score': [90, 80, 85, 95]}
df1 = pd.DataFrame(data1)
# 创建学生个人信息数据
data2 = {'name': ['张三', '李四', '王五', '赵六'], 'age': [18, 19, 20, 21]}
df2 = pd.DataFrame(data2)
# 按照姓名进行拼接
df3 = pd.concat([df1, df2], axis=1)
print(df3)
上述代码中,我们首先创建了两个DataFrame,分别是考试成绩数据和学生个人信息数据。然后使用concat函数按照姓名进行拼接,并将结果输出。输出结果如下:
name score name age
0 张三 90 张三 18
1 李四 80 李四 19
2 王五 85 王五 20
3 赵六 95 赵六 21
可以看到,通过concat函数的拼接,在结果DataFrame中,姓名列会重复出现,因此需要通过数据清洗来去除重复列。
示例2
假设我们需要将多个.csv文件合并到一起,并保存为一个新的文件。具体步骤如下:
首先,我们需要使用pandas库中的read_csv函数,读取多个csv文件,使用concat函数拼接成一个DataFrame。在进行拼接之前,需要将csv文件中的列名进行规整,保证列名相同。具体代码如下:
import pandas as pd
import glob
# 获取所有.csv文件的路径
csv_files = glob.glob('*.csv')
# 将所有.csv文件读取为DataFrame,并进行拼接
df_total = pd.concat([pd.read_csv(file) for file in csv_files])
# 保存拼接后的DataFrame为一个新的文件
df_total.to_csv('total.csv', index=False)
上述代码中,我们通过glob库获取了所有.csv文件的路径,然后使用列表推导式将多个csv文件读取为DataFrame,并使用concat函数进行拼接。最后,使用to_csv函数将拼接后的DataFrame保存为一个新的.csv文件。
merge合并
还有一种常见的数据合并方式是使用merge函数,它可以根据一组键将不同DataFrame中的行连接起来。
merge函数的基本用法如下:
pd.merge(left, right, on=None, left_on=None, right_on=None, how='inner', sort=False)
其中,参数left和right表示需要进行合并的两个DataFrame;参数on表示要使用的列名作为连接键,如果两个DataFrame的列名相同,则可以使用on;参数left_on和right_on表示使用不同的列名作为连接键;参数how表示连接方式,有inner(内连接)、outer(外连接)、left(左连接)、right(右连接)四种方式。
下面我们通过实例来进一步地了解merge的使用。
示例3
假设我们有两个DataFrame,分别记录了学生的选课情况和考试成绩,我们需要将这两个DataFrame按照学生姓名进行合并。具体代码如下:
import pandas as pd
# 创建选课数据
data1 = {'name': ['张三', '李四', '王五', '赵六'], 'course': ['math', 'Chinese', 'English', 'history']}
df1 = pd.DataFrame(data1)
# 创建考试成绩数据
data2 = {'name': ['张三', '李四', '王五', '赵六'], 'score': [90, 80, 85, 95]}
df2 = pd.DataFrame(data2)
# 合并两个DataFrame
df3 = pd.merge(df1, df2, on='name')
print(df3)
上述代码中,我们首先创建了两个DataFrame,分别是选课数据和考试成绩数据。然后使用merge函数按照学生的姓名进行合并,并将结果输出。输出结果如下:
name course score
0 张三 math 90
1 李四 Chinese 80
2 王五 English 85
3 赵六 history 95
从上面的代码和结果可以看出,我们首先根据name这个键进行了合并。在这种情况下,merge函数会自动识别两个DataFrame中该键列存在的情况,并进行合并,最终得到了一个包含了course和score的新DataFrame。
示例4
假设我们有两个DataFrame,一个包含学生的成绩,另一个包含学生的家庭信息。现在我们要将这两个DataFrame进行合并,并使用姓名和家庭地址这两个列作为连接键。具体代码如下:
import pandas as pd
# 创建考试成绩数据
data1 = {'name': ['张三', '李四', '王五', '赵六'], 'score': [90, 80, 85, 95], 'address': ['北京', '上海', '广州', '天津']}
df1 = pd.DataFrame(data1)
# 创建学生家庭信息数据
data2 = {'name': ['张三', '李四', '王五', '赵六'], 'address': ['上海', '北京', '广州', '天津'],
'tel': [111111, 222222, 333333, 444444]}
df2 = pd.DataFrame(data2)
# 按照姓名和地址进行合并
df3 = pd.merge(df1, df2, on=['name', 'address'], how='outer')
print(df3)
上述代码中,我们创建了两个DataFrame,分别是考试成绩数据和学生家庭信息数据。然后使用merge函数按照姓名和家庭地址进行合并,并将结果输出。输出结果如下:
name score address tel
0 张三 90.0 北京 222222.0
1 李四 80.0 上海 111111.0
2 王五 85.0 广州 333333.0
3 赵六 95.0 天津 444444.0
从输出结果可以看出,在这种情况下,我们需要使用outer连接方式,以保留所有学生的数据。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pandas数据的合并与拼接的实现 - Python技术站