合并Python Pandas dataframe并将不匹配的值设置为NaN

合并Python Pandas dataframe并将不匹配的值设置为NaN

在处理数据时,我们通常需要合并多个表格或数据集。利用Python的Pandas库可以轻松实现这一过程。当数据集中存在缺失值时,合并表格也经常需要将不匹配的值设置成NaN。本文将详细介绍在Python中通过Pandas库合并数据集并将不匹配的值设置为NaN的方法。

1. Pandas DataFrame的基础知识

在开始讲解Pandas库中如何合并数据集之前,我们需要先了解一些Pandas DataFrame的基础知识。

创建Pandas DataFrame

我们可以使用Pandas库中的DataFrame()函数来创建DataFrame对象。

import pandas as pd

# 通过字典创建DataFrame
data = {'name': ['Jerry', 'Tom', 'John'], 'age': [22, 24, 19]}
df = pd.DataFrame(data)
print(df)

输出结果:

    name  age
0  Jerry   22
1    Tom   24
2   John   19

读取DataFrame

我们可以使用Pandas库提供的多种数据读取方法来获取DataFrame对象,例如读取CSV文件:

# 读取CSV文件
df = pd.read_csv('data.csv', header=0)
print(df)

访问DataFrame

我们可以使用loc[]iloc[]访问DataFrame中的特定数据。

# 通过索引访问DataFrame
print(df.loc[0])  # 访问第一行数据
print(df.iloc[0])  # 访问第一行数据
print(df['name'])  # 访问name列

输出结果:

name     Jerry
age         22
Name: 0, dtype: object
name     Jerry
age         22
Name: 0, dtype: object
0    Jerry
1      Tom
2     John
Name: name, dtype: object

2. Pandas DataFrame的合并方法

横向合并

我们可以使用pd.concat()方法来将两个或多个DataFrame横向合并。

# 横向合并两个DataFrame
data1 = {'name': ['Jerry', 'Tom', 'John'], 'age': [22, 24, 19]}
data2 = {'name': ['Jerry', 'Tom', 'Bob'], 'score': [90, 85, 75]}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df3 = pd.concat([df1, df2], axis=1, sort=False)
print(df3)

其中,axis=1表示横向合并,sort=False表示不排序。输出结果:

    name  age   name  score
0  Jerry   22  Jerry     90
1    Tom   24    Tom     85
2   John   19    Bob     75

在横向合并时,pd.concat()方法默认将所有列都合并。如果列名相同,Pandas库会自动进行列名的拼接。如果列名不同,Pandas库将合并所有列,并将不匹配的值设置为NaN。

纵向合并

我们可以使用pd.concat()方法来将两个或多个DataFrame纵向合并。

# 纵向合并两个DataFrame
data1 = {'name': ['Jerry', 'Tom', 'John'], 'age': [22, 24, 19]}
data2 = {'name': ['Jerry', 'Tom', 'Bob'], 'age': [21, 23, 20]}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df3 = pd.concat([df1, df2], axis=0, sort=False)
print(df3)

其中,axis=0表示纵向合并,sort=False表示不排序。输出结果:

    name  age
0  Jerry   22
1    Tom   24
2   John   19
0  Jerry   21
1    Tom   23
2    Bob   20

在纵向合并时,`pd.concat()`方法默认将所有行都合并。如果行数相同,Pandas库会自动进行行拼接。如果行数不同,Pandas库将合并所有行,并将不匹配的值设置为NaN。

### 合并方式

在使用`pd.concat()`方法时,我们可以通过`join`参数来指定合并方式。默认情况下,合并方式为`outer`,表示将所有行或列都合并,将不存在的数值设置为NaN。我们也可以使用`inner`指定为内连接方式,只保留共有的行或列。

```python
# 内连接合并
data1 = {'name': ['Jerry', 'Tom', 'John'], 'age': [22, 24, 19]}
data2 = {'name': ['Jerry', 'Tom', 'Bob'], 'score': [90, 85, 75]}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df3 = pd.concat([df1, df2], axis=1, join='inner')
print(df3)

输出结果:

    name  age   name  score
0  Jerry   22  Jerry     90
1    Tom   24    Tom     85

合并多个DataFrame

我们可以使用pd.concat()方法同时合并多个DataFrame。

# 同时合并多个DataFrame
data1 = {'name': ['Jerry', 'Tom', 'John'], 'age': [22, 24, 19]}
data2 = {'name': ['Jerry', 'Tom', 'Bob'], 'score': [90, 85, 75]}
data3 = {'name': ['Jerry', 'Tom', 'Bob'], 'height': [175, 182, 168]}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df3 = pd.DataFrame(data3)
df4 = pd.concat([df1, df2, df3], axis=1, join='outer')
print(df4)

输出结果:

    name  age   name  score   name  height
0  Jerry   22  Jerry   90.0  Jerry     175
1    Tom   24    Tom   85.0    Tom     182
2   John   19    Bob   75.0    Bob     168

3. Pandas DataFrame的合并及不匹配值的处理

在实际应用中,各个数据集的数据有时并不完整或者存在重复项。在这种情况下,我们需要对多个数据集进行合并,并将不匹配的值设置为NaN。接下来我们将介绍在Pandas库中如何合并数据集并将不匹配的值设置为NaN。

数据集合并

Pandas库中提供了merge()方法来合并两个DataFrame,其中关键字参数on可以指定相同列名进行合并。

# 合并两个DataFrame
data1 = {'name': ['Jerry', 'Tom', 'John'], 'age': [22, 24, 19], 'gender': ['M', 'M', 'F']}
data2 = {'name': ['Jerry', 'Tom', 'Bob'], 'score': [90, 85, 75], 'gender': ['M', 'M', 'M']}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df3 = pd.merge(df1, df2, on='name')
print(df3)

输出结果:

    name  age gender  score
0  Jerry   22      M     90
1    Tom   24      M     85

在两个DataFrame中,gender列存在不匹配的值,merge()方法将不匹配的值设置为NaN。如果存在多个列相同的情况,我们可以通过on参数来指定列名,也可以使用left_onright_on参数指定左右DataFrame的列名。

# 合并两个DataFrame
data1 = {'name': ['Jerry', 'Tom', 'John'], 'age': [22, 24, 19], 'gender': ['M', 'M', 'F']}
data2 = {'stu_name':['Jerry', 'Tom', 'Bob'], 'score': [90, 85, 75], 'stu_gender': ['M', 'M', 'M']}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df3 = pd.merge(df1, df2, left_on='name', right_on='stu_name')
print(df3)

输出结果:

    name  age gender stu_name  score stu_gender
0  Jerry   22      M    Jerry     90          M
1    Tom   24      M      Tom     85          M

多个数据集合并

在实际应用中,我们通常需要将多个数据集合并为一个。我们可以使用pd.merge()方法进行多个DataFrame的合并。

# 合并多个DataFrame
data1 = {'name': ['Jerry', 'Tom', 'John'], 'age': [22, 24, 19], 'gender': ['M', 'M', 'F']}
data2 = {'name': ['Jerry', 'Tom', 'Bob'], 'score': [90, 85, 75], 'gender': ['M', 'M', 'M']}
data3 = {'name': ['Jerry', 'Tom'], 'height': [175, 182]}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df3 = pd.DataFrame(data3)
df4 = pd.merge(pd.merge(df1, df2, on='name'), df3, on='name')
print(df4)

输出结果:

    name  age gender  score  height
0  Jerry   22      M     90     175
1    Tom   24      M     85     182

在多个DataFrame中,name列存在不匹配的值,merge()方法将不匹配的值设置为NaN。

结论

使用Pandas库可以方便地合并多个数据集并将不匹配的值设置为NaN,有助于我们在进行数据处理时更加高效。同时,我们需要注意在合并数据集时要处理好存在不匹配值的情况,以避免在数据分析中产生误差。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程