1.3 增加,刪除與合并數(shù)據(jù)
1.3.1 增加數(shù)據(jù)
在原數(shù)據(jù)末尾增加一列時,語法為 df[‘新列名'] = 某個值或某個元素個數(shù)與 DataFrame 列數(shù)相同的列表
,例如:
df = pd.DataFrame({'姓名':['張三', '李四', '王五'], '統(tǒng)計學(xué)': [95, 100, 88], '高數(shù)': [82, 90, 88], '英語': [84, 89, 78]})
df['計算機(jī)'] = [92, 69, 75]
df
|
姓名 |
統(tǒng)計學(xué) |
高數(shù) |
英語 |
計算機(jī) |
0 |
張三 |
95 |
82 |
84 |
92 |
1 |
趙四 |
100 |
90 |
89 |
69 |
2 |
王五 |
88 |
88 |
78 |
75 |
在原數(shù)據(jù)末尾增加一行數(shù)據(jù)時,比較簡單的方式是用 loc 函數(shù),df.loc[行索引] = 新行值
。
df.loc[3] = ['馬六', 65, 70, 69, 55]
df
|
姓名 |
統(tǒng)計學(xué) |
高數(shù) |
英語 |
計算機(jī) |
0 |
張三 |
95 |
82 |
84 |
92 |
1 |
趙四 |
100 |
90 |
89 |
69 |
2 |
王五 |
88 |
88 |
78 |
75 |
3 |
馬六 |
65 |
70 |
69 |
55 |
若要在指定位置插入列,則需要用到 insert
函數(shù)。
df.insert(1, '運(yùn)籌學(xué)', [61, 72, 84, 81])
df
|
姓名 |
運(yùn)籌學(xué) |
統(tǒng)計學(xué) |
高數(shù) |
英語 |
計算機(jī) |
0 |
張三 |
61 |
95 |
82 |
84 |
92 |
1 |
趙四 |
72 |
100 |
90 |
89 |
69 |
2 |
王五 |
84 |
88 |
88 |
78 |
75 |
3 |
馬六 |
81 |
65 |
70 |
69 |
55 |
df.insert(3, 'Python', [81, 76, 74, 71])
df
|
姓名 |
運(yùn)籌學(xué) |
統(tǒng)計學(xué) |
Python |
高數(shù) |
英語 |
計算機(jī) |
0 |
張三 |
61 |
95 |
81 |
82 |
84 |
92 |
1 |
趙四 |
72 |
100 |
76 |
90 |
89 |
69 |
2 |
王五 |
84 |
88 |
74 |
88 |
78 |
75 |
3 |
馬六 |
81 |
65 |
71 |
70 |
69 |
55 |
若要在指定位置插入行,目前 Pandas 還沒有專門的函數(shù),一般采用concat
函數(shù)合并多個 DataFrame 的方式,增加多列或多行數(shù)據(jù)也可以使用 concat
函數(shù)或merge
函數(shù),具體參看后面的合并數(shù)據(jù)章節(jié)。
1.3.2 刪除數(shù)據(jù)
Pandas 可以利用drop
函數(shù)刪除行數(shù)據(jù)或列數(shù)據(jù)。刪除一行時,參數(shù)為行標(biāo)簽名以及inplace = True
。若沒有參數(shù)inplace = True
,原始的 DataFrame 數(shù)據(jù)不變。
df.drop(3, inplace = True)
df
|
姓名 |
運(yùn)籌學(xué) |
統(tǒng)計學(xué) |
Python |
高數(shù) |
英語 |
計算機(jī) |
0 |
張三 |
61 |
95 |
81 |
82 |
84 |
92 |
1 |
趙四 |
72 |
100 |
76 |
90 |
89 |
69 |
2 |
王五 |
84 |
88 |
74 |
88 |
78 |
75 |
刪除一列時,多了一個參數(shù)axis = 1
:
df.drop('英語', inplace = True, axis = 1)
df
|
姓名 |
運(yùn)籌學(xué) |
統(tǒng)計學(xué) |
Python |
高數(shù) |
計算機(jī) |
0 |
張三 |
61 |
95 |
81 |
82 |
92 |
1 |
趙四 |
72 |
100 |
76 |
90 |
69 |
2 |
王五 |
84 |
88 |
74 |
88 |
75 |
df.drop(['運(yùn)籌學(xué)', '高數(shù)'], inplace = True, axis = 1)
df
|
姓名 |
統(tǒng)計學(xué) |
Python |
計算機(jī) |
0 |
張三 |
95 |
81 |
92 |
1 |
趙四 |
100 |
76 |
69 |
2 |
王五 |
88 |
74 |
75 |
1.3.3 合并數(shù)據(jù)
Pandas 中比較常用的兩個合并數(shù)據(jù)的方法是concat
與merge
。 當(dāng)兩個 DataFrame 數(shù)據(jù)表具有完全相同的列標(biāo)簽時,一般用concat
,其他情況下多用merge
。
df1 = pd.DataFrame({'姓名': ['張三', '李四', '王五'], '統(tǒng)計學(xué)': [85, 68, 90], '高數(shù)': [82, 63, 88], '英語': [84, 90, 78]})
df1
|
姓名 |
統(tǒng)計學(xué) |
高數(shù) |
英語 |
0 |
張三 |
85 |
82 |
84 |
1 |
李四 |
68 |
63 |
90 |
2 |
王五 |
90 |
88 |
78 |
df2 = pd.DataFrame({'姓名': ['馬大帥', '陳小虎'], '統(tǒng)計學(xué)': [83, 59], '高數(shù)': [92, 70], '英語': [94, 78]})
df2
|
姓名 |
統(tǒng)計學(xué) |
高數(shù) |
英語 |
0 |
馬大帥 |
83 |
92 |
94 |
1 |
陳小虎 |
59 |
70 |
78 |
兩張表具有完全相同的行名,用concat
合并的代碼如下:
pd.concat([df1, df2])
|
姓名 |
統(tǒng)計學(xué) |
高數(shù) |
英語 |
0 |
張三 |
85 |
82 |
84 |
1 |
李四 |
68 |
63 |
90 |
2 |
王五 |
90 |
88 |
78 |
0 |
馬大帥 |
83 |
92 |
94 |
1 |
陳小虎 |
59 |
70 |
78 |
若要合并后的 index 重新命名,可以加參數(shù)ignore_index = True
,讓合并后數(shù)據(jù)的 index 重新從小到大命名:
pd.concat([df1, df2], ignore_index = True)
|
姓名 |
統(tǒng)計學(xué) |
高數(shù) |
英語 |
0 |
張三 |
85 |
82 |
84 |
1 |
李四 |
68 |
63 |
90 |
2 |
王五 |
90 |
88 |
78 |
3 |
馬大帥 |
83 |
92 |
94 |
4 |
陳小虎 |
59 |
70 |
78 |
假如有下面的數(shù)據(jù):
df3 = pd.DataFrame({'姓名': ['張三', '李四', '王五'], '會計': [75, 78, 80], '管理學(xué)': [94, 96, 88]})
df3
|
姓名 |
會計 |
管理學(xué) |
0 |
張三 |
75 |
94 |
1 |
李四 |
78 |
96 |
2 |
王五 |
80 |
88 |
df1 與 df3 的姓名相同,但列名不完全相同。我們想把 df3 的列添加到 df1 中,此時就要使用merge
方法了,它的使用語法一般如下:
DataFrame.merge(right, how='inner', on=None) |
right |
需要合并的另一個 DataFrame 數(shù)據(jù) |
how |
默認(rèn)為 'inner',表示內(nèi)連接,取兩個數(shù)據(jù)表中匹配字段的交集進(jìn)行合并 |
'outer',表示外連接,取兩個數(shù)據(jù)表中匹配字段的并集進(jìn)行合并 |
'left',表示左連接,取左邊數(shù)據(jù)表中匹配字段進(jìn)行合并 |
'right',表示右連接,取右邊數(shù)據(jù)表中匹配字段進(jìn)行合并 |
on |
匹配的字段(列),可以是一個或多個 |
因此,對于 df1 與 df3,用merge
合并時,匹配的字段(列名)為’姓名’:
df1.merge(df3, on = '姓名')
|
姓名 |
統(tǒng)計學(xué) |
高數(shù) |
英語 |
會計 |
管理學(xué) |
0 |
張三 |
85 |
82 |
84 |
75 |
94 |
1 |
李四 |
68 |
63 |
90 |
78 |
96 |
2 |
王五 |
90 |
88 |
78 |
80 |
88 |
merge
也能實(shí)現(xiàn)concat
的合并效果,例如,合并 df1 與 df2:
df1.merge(df2, on = ['姓名', '統(tǒng)計學(xué)', '高數(shù)', '英語'], how = 'outer')
|
姓名 |
統(tǒng)計學(xué) |
高數(shù) |
英語 |
0 |
張三 |
85 |
82 |
84 |
1 |
李四 |
68 |
63 |
90 |
2 |
王五 |
90 |
88 |
78 |
3 |
馬大帥 |
83 |
92 |
94 |
4 |
陳小虎 |
59 |
70 |
78 |
在上面的代碼中,匹配的字段為所有的列,連接方式為外連接,實(shí)現(xiàn)結(jié)果與concat
相同。若連接方式為其他類型,顯示效果如下:文章來源:http://www.zghlxwxcb.cn/news/detail-641160.html
df1.merge(df2, on = ['姓名', '統(tǒng)計學(xué)', '高數(shù)', '英語'], how = 'inner')
|
姓名 |
統(tǒng)計學(xué) |
高數(shù) |
英語 |
df1.merge(df2, on = ['姓名', '統(tǒng)計學(xué)', '高數(shù)', '英語'], how = 'left')
|
姓名 |
統(tǒng)計學(xué) |
高數(shù) |
英語 |
0 |
張三 |
85 |
82 |
84 |
1 |
李四 |
68 |
63 |
90 |
2 |
王五 |
90 |
88 |
78 |
df1.merge(df2, on = ['姓名', '統(tǒng)計學(xué)', '高數(shù)', '英語'], how = 'right')
|
姓名 |
統(tǒng)計學(xué) |
高數(shù) |
英語 |
0 |
馬大帥 |
83 |
92 |
94 |
1 |
陳小虎 |
59 |
70 |
78 |
在合并數(shù)據(jù)表時,若某些字段沒有對應(yīng)數(shù)據(jù),Pandas 會自動用 NaN 替代,下面的例子展示了不同連接方式的效果。文章來源地址http://www.zghlxwxcb.cn/news/detail-641160.html
df1 = pd.DataFrame({'班級': ['一班', '二班', '一班'], '姓名': ['張三', '李四', '王五'], '性別': ['男', '男', '女'], '籍貫': ['北京', '上海', '重慶']})
df1
|
班級 |
姓名 |
性別 |
籍貫 |
0 |
一班 |
張三 |
男 |
北京 |
1 |
二班 |
李四 |
男 |
上海 |
2 |
一班 |
王五 |
女 |
重慶 |
df2 = pd.DataFrame({ '姓名': ['張三', '陳小虎'], '統(tǒng)計學(xué)': [85, 59]})
df2
|
姓名 |
統(tǒng)計學(xué) |
0 |
張三 |
85 |
1 |
陳小虎 |
59 |
df1.merge(df2, on = '姓名')
|
班級 |
姓名 |
性別 |
籍貫 |
統(tǒng)計學(xué) |
0 |
一班 |
張三 |
男 |
北京 |
85 |
df1.merge(df2, on = '姓名', how = 'outer')
|
班級 |
姓名 |
性別 |
籍貫 |
統(tǒng)計學(xué) |
0 |
一班 |
張三 |
男 |
北京 |
85.0 |
1 |
二班 |
李四 |
男 |
上海 |
NaN |
2 |
一班 |
王五 |
女 |
重慶 |
NaN |
3 |
NaN |
陳小虎 |
NaN |
NaN |
59.0 |
df1.merge(df2, on = '姓名', how = 'left')
|
班級 |
姓名 |
性別 |
籍貫 |
統(tǒng)計學(xué) |
0 |
一班 |
張三 |
男 |
北京 |
85.0 |
1 |
二班 |
李四 |
男 |
上海 |
NaN |
2 |
一班 |
王五 |
女 |
重慶 |
NaN |
df1.merge(df2, on = '姓名', how = 'right')
|
班級 |
姓名 |
性別 |
籍貫 |
統(tǒng)計學(xué) |
0 |
一班 |
張三 |
男 |
北京 |
85 |
1 |
NaN |
陳小虎 |
NaN |
NaN |
59 |
到了這里,關(guān)于【Pandas 入門-2】增加,刪除與合并數(shù)據(jù) concat, merge的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!