3.3.2 数据替换与合并
将 'Cabin' 此栏删除或是找出缺失值并替换,以下实例将先演示找出缺失值,用 inplace()函数替换成 'S' 这个并未被使用过的舱位。
实例
# 找出缺失值并替换, inplace 设为 True 会直接修改数据集,如果不要修改的话,可以设为 False,并回传替换结果亦可
df['Cabin'].replace(to_replace=np.NaN, value='S', inplace=True)
df[['Cabin']].groupby(['Cabin'],sort=True).count()
输出结果为:
Cabin
A10
A14
A16
A19
A20
...
F38
F4
G6
S
T
148 rows × 0 columns
运算时,文字类型并不容易进行运算,所以将 'Sex' 从文字转换成数字类型,并新增一个栏位(列) 'Sex_Int' ,接着使用 drop() 函数删除 'Sex' 栏,透过 info()观察运行结果。预设所有对数据集的修改操作,并不会直接对原本的数据集做操作,所以需要将操作后的结果回传到新的数据集。
df['Sex_Int'] = df['Sex'].map({'female' : 0,'male' : 1}).astype('int')
df = df.drop('Sex', axis=1)
df.info()
输出结果为:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 891 non-null int64
1 Survived 891 non-null int64
2 Pclass 891 non-null int64
3 Name 891 non-null object
4 Age 714 non-null float64
5 SibSp 891 non-null int64
6 Parch 891 non-null int64
7 Ticket 891 non-null object
8 Fare 891 non-null float64
9 Cabin 891 non-null object
10 Embarked 889 non-null object
11 Sex_Int 891 non-null int32
dtypes: float64(2), int32(1), int64(5), object(4)
memory usage: 80.2+ KB
透过 concate() 函数来进行合并,透过 merge() 函数进行列合并, concate() 比较单纯,只是会增加数据集的笔数,而 merge() 需要考虑的比较多,因为要考量合并两个数据集时,要并集 (unions) 方式合并还是交集 (intersections)。
以下为 concate() 实例,将 df1 与 df2 这两个数据集合并,如果加上 ignore_index=True 这个参数, index 的编号会接续下去,也可以用 append() 这个函数来进行添加。
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']})
输出结果为:
print(pd.concat([df1,df2]))
print(pd.concat([df1,df2],ignore_index=True))
print(df1.append(df2,ignore_index=True))
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
0 A4 B4 C4 D4
1 A5 B5 C5 D5
2 A6 B6 C6 D6
3 A7 B7 C7 D7
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
以下为 merge() 实例,要注意的是 merge 的方式,可以是交集或并集,可以可考虑以左边为主,还是以右边为主的合并方式。
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
df3 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
'D': ['D2', 'D3', 'D6', 'D7'],
'F': ['F2', 'F3', 'F6', 'F7']})
print('交集 \n', pd.merge(df1,df3, on = 'B', how = 'inner'))
print('并集 \n', pd.merge(df1,df3, on = 'B', how = 'outer'))
print('左连接 \n', pd.merge(df1,df3, on = 'B', how = 'left'))
print('右连接 \n', pd.merge(df1,df3, on = 'B', how = 'right'))
输出结果为:
交集
A B C D_x D_y F
0 A2 B2 C2 D2 D2 F2
1 A3 B3 C3 D3 D3 F3
并集
A B C D_x D_y F
0 A0 B0 C0 D0 NaN NaN
1 A1 B1 C1 D1 NaN NaN
2 A2 B2 C2 D2 D2 F2
3 A3 B3 C3 D3 D3 F3
4 NaN B6 NaN NaN D6 F6
5 NaN B7 NaN NaN D7 F7
左连接
A B C D_x D_y F
0 A0 B0 C0 D0 NaN NaN
1 A1 B1 C1 D1 NaN NaN
2 A2 B2 C2 D2 D2 F2
3 A3 B3 C3 D3 D3 F3
右连接
A B C D_x D_y F
0 A2 B2 C2 D2 D2 F2
1 A3 B3 C3 D3 D3 F3
2 NaN B6 NaN NaN D6 F6
3 NaN B7 NaN NaN D7 F7