合并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_on
和right_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,有助于我们在进行数据处理时更加高效。同时,我们需要注意在合并数据集时要处理好存在不匹配值的情况,以避免在数据分析中产生误差。