3-03-2 泰坦尼克号竞赛-数据替换与合并

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

Python数据处理-文章目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值