实验:
第六课 数据分析工具Pandas高阶
第七节 数据规整(1)--数据合并 concat
In [1]:
import pandas as pd
import numpy as np
In [2]:
# 创建dataframe
df1 = pd.DataFrame({'A':['A0', 'A1', 'A2', 'A3'],
'B':['B0', 'B1', 'B2', 'B3'],
'C':['C0', 'C1', 'C2', 'C3'],
'D':['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A':['A4', 'A5', 'A6', 'A7'],
'B':['B4', 'B5', 'B6', 'B7'],
'C':['C4', 'C5', 'C6', 'C7'],
'D':['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
df3 = pd.DataFrame({'A':['A8', 'A9', 'A10', 'A11'],
'B':['B8', 'B9', 'B10', 'B11'],
'C':['C8', 'C9', 'C10', 'C11'],
'D':['D8', 'D9', 'D10', 'D11']},
index=[0, 1, 2, 3])
In [3]:
df1
Out[3]:
A | B | C | D | |
---|---|---|---|---|
0 | A0 | B0 | C0 | D0 |
1 | A1 | B1 | C1 | D1 |
2 | A2 | B2 | C2 | D2 |
3 | A3 | B3 | C3 | D3 |
In [4]:
df2
Out[4]:
A | B | C | D | |
---|---|---|---|---|
4 | A4 | B4 | C4 | D4 |
5 | A5 | B5 | C5 | D5 |
6 | A6 | B6 | C6 | D6 |
7 | A7 | B7 | C7 | D7 |
In [5]:
df3
Out[5]:
A | B | C | D | |
---|---|---|---|---|
0 | A8 | B8 | C8 | D8 |
1 | A9 | B9 | C9 | D9 |
2 | A10 | B10 | C10 | D10 |
3 | A11 | B11 | C11 | D11 |
纵向合并
In [6]:
#列名相同
pd.concat([df1,df2],axis=0)
Out[6]:
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 |
In [7]:
# 列名不同
pd.concat([df1,df3],axis=0)
Out[7]:
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 | A8 | B8 | C8 | D8 |
1 | A9 | B9 | C9 | D9 |
2 | A10 | B10 | C10 | D10 |
3 | A11 | B11 | C11 | D11 |
横向合并
In [8]:
# index相同
pd.concat([df1,df3],axis=1)
Out[8]:
A | B | C | D | A | B | C | D | |
---|---|---|---|---|---|---|---|---|
0 | A0 | B0 | C0 | D0 | A8 | B8 | C8 | D8 |
1 | A1 | B1 | C1 | D1 | A9 | B9 | C9 | D9 |
2 | A2 | B2 | C2 | D2 | A10 | B10 | C10 | D10 |
3 | A3 | B3 | C3 | D3 | A11 | B11 | C11 | D11 |
In [9]:
# index 不同
pd.concat([df1,df2],axis=1)
Out[9]:
A | B | C | D | A | B | C | D | |
---|---|---|---|---|---|---|---|---|
0 | A0 | B0 | C0 | D0 | NaN | NaN | NaN | NaN |
1 | A1 | B1 | C1 | D1 | NaN | NaN | NaN | NaN |
2 | A2 | B2 | C2 | D2 | NaN | NaN | NaN | NaN |
3 | A3 | B3 | C3 | D3 | NaN | NaN | NaN | NaN |
4 | NaN | NaN | NaN | NaN | A4 | B4 | C4 | D4 |
5 | NaN | NaN | NaN | NaN | A5 | B5 | C5 | D5 |
6 | NaN | NaN | NaN | NaN | A6 | B6 | C6 | D6 |
7 | NaN | NaN | NaN | NaN | A7 | B7 | C7 | D7 |
(2)--数据连接 merge
In [10]:
import pandas as pd
import numpy as np
In [13]:
# 创建dataframe
staff_df = pd.DataFrame([{'姓名':'张三','部门':'研发部'},
{'姓名':'李四','部门':'财务部'},
{'姓名':'赵六','部门':'市场部'}])
student_df = pd.DataFrame([{'姓名':'张三','部门':'计算机'},
{'姓名':'李四','部门':'会计'},
{'姓名':'王五','部门':'市场营销'}])
In [14]:
staff_df
Out[14]:
姓名 | 部门 | |
---|---|---|
0 | 张三 | 研发部 |
1 | 李四 | 财务部 |
2 | 赵六 | 市场部 |
In [15]:
student_df
Out[15]:
姓名 | 部门 | |
---|---|---|
0 | 张三 | 计算机 |
1 | 李四 | 会计 |
2 | 王五 | 市场营销 |
连接操作
In [16]:
# 外连接
pd.merge(staff_df,student_df,how='outer',on='姓名')
#或者
#staf_df.merge(student_df,how='outer', on='姓名')
Out[16]:
姓名 | 部门_x | 部门_y | |
---|---|---|---|
0 | 张三 | 研发部 | 计算机 |
1 | 李四 | 财务部 | 会计 |
2 | 赵六 | 市场部 | NaN |
3 | 王五 | NaN | 市场营销 |
In [17]:
# 内连接
pd.merge(staff_df,student_df,how='inner',on='姓名')
#或者
#staf_df.merge(student_df,how='ineer', on='姓名')
Out[17]:
姓名 | 部门_x | 部门_y | |
---|---|---|---|
0 | 张三 | 研发部 | 计算机 |
1 | 李四 | 财务部 | 会计 |
In [18]:
# 左连接
pd.merge(staff_df,student_df,how='left',on='姓名')
#或者
#staf_df.merge(student_df,how='left', on='姓名')
Out[18]:
姓名 | 部门_x | 部门_y | |
---|---|---|---|
0 | 张三 | 研发部 | 计算机 |
1 | 李四 | 财务部 | 会计 |
2 | 赵六 | 市场部 | NaN |
In [19]:
# 右连接
pd.merge(staff_df,student_df,how='right',on='姓名')
#或者
#staf_df.merge(student_df,how='right', on='姓名')
Out[19]:
姓名 | 部门_x | 部门_y | |
---|---|---|---|
0 | 张三 | 研发部 | 计算机 |
1 | 李四 | 财务部 | 会计 |
2 | 王五 | NaN | 市场营销 |
In [21]:
#添加新的数据列
staff_df['地址'] = ['天津','北京','上海']
student_df['地址'] = ['天津','上海','广州']
In [22]:
staff_df
Out[22]:
姓名 | 部门 | 地址 | |
---|---|---|---|
0 | 张三 | 研发部 | 天津 |
1 | 李四 | 财务部 | 北京 |
2 | 赵六 | 市场部 | 上海 |
In [23]:
student_df
Out[23]:
姓名 | 部门 | 地址 | |
---|---|---|---|
0 | 张三 | 计算机 | 天津 |
1 | 李四 | 会计 | 上海 |
2 | 王五 | 市场营销 | 广州 |
In [24]:
#处理重复列名
# 如果两个数据中包含有相同的列名(不是要合并的列)时,merge会自动加后缀作为区别
pd.merge(staff_df,student_df,how='left',left_on='姓名',right_on='姓名')
Out[24]:
姓名 | 部门_x | 地址_x | 部门_y | 地址_y | |
---|---|---|---|---|---|
0 | 张三 | 研发部 | 天津 | 计算机 | 天津 |
1 | 李四 | 财务部 | 北京 | 会计 | 上海 |
2 | 赵六 | 市场部 | 上海 | NaN | NaN |
按索引连接
In [26]:
# 设置“姓名”为索引
staff_df.set_index('姓名',inplace=True)
student_df.set_index('姓名',inplace=True)
In [27]:
staff_df
Out[27]:
部门 | 地址 | |
---|---|---|
姓名 | ||
张三 | 研发部 | 天津 |
李四 | 财务部 | 北京 |
赵六 | 市场部 | 上海 |
In [28]:
student_df
Out[28]:
部门 | 地址 | |
---|---|---|
姓名 | ||
张三 | 计算机 | 天津 |
李四 | 会计 | 上海 |
王五 | 市场营销 | 广州 |
In [29]:
pd.merge(staff_df,student_df,how='left',left_index=True,right_index=True)
# 或者
# staff_df.merge(student_df,how='left',left_index=True,right_index=True)
Out[29]:
部门_x | 地址_x | 部门_y | 地址_y | |
---|---|---|---|---|
姓名 | ||||
张三 | 研发部 | 天津 | 计算机 | 天津 |
李四 | 财务部 | 北京 | 会计 | 上海 |
赵六 | 市场部 | 上海 | NaN | NaN |
数据重构stack、unstack
In [30]:
import pandas as pd
In [31]:
# 创建dataframe
header = pd.MultiIndex.from_product([['Semester1','Semester2'],['Math','Science']])
d = [[12,45,67,56],[78,89,45,67],[45,67,89,90],[67,44,56,55]]
df = pd.DataFrame(d,index=['Alisa','Bobby','Cathrine','Jack'],columns=header)
df
Out[31]:
Semester1 | Semester2 | |||
---|---|---|---|---|
Math | Science | Math | Science | |
Alisa | 12 | 45 | 67 | 56 |
Bobby | 78 | 89 | 45 | 67 |
Cathrine | 45 | 67 | 89 | 90 |
Jack | 67 | 44 | 56 | 55 |
In [33]:
stacked_df = df.stack()
stacked_df
Out[33]:
Semester1 | Semester2 | ||
---|---|---|---|
Alisa | Math | 12 | 67 |
Science | 45 | 56 | |
Bobby | Math | 78 | 45 |
Science | 89 | 67 | |
Cathrine | Math | 45 | 89 |
Science | 67 | 90 | |
Jack | Math | 67 | 56 |
Science | 44 | 55 |
In [34]:
# level 参数
df.stack(level=0)
Out[34]:
Math | Science | ||
---|---|---|---|
Alisa | Semester1 | 12 | 45 |
Semester2 | 67 | 56 | |
Bobby | Semester1 | 78 | 89 |
Semester2 | 45 | 67 | |
Cathrine | Semester1 | 45 | 67 |
Semester2 | 89 | 90 | |
Jack | Semester1 | 67 | 44 |
Semester2 | 56 | 55 |
In [35]:
df.stack(level=1)
Out[35]:
Semester1 | Semester2 | ||
---|---|---|---|
Alisa | Math | 12 | 67 |
Science | 45 | 56 | |
Bobby | Math | 78 | 45 |
Science | 89 | 67 | |
Cathrine | Math | 45 | 89 |
Science | 67 | 90 | |
Jack | Math | 67 | 56 |
Science | 44 | 55 |
In [36]:
df.stack(level=-1)
Out[36]:
Semester1 | Semester2 | ||
---|---|---|---|
Alisa | Math | 12 | 67 |
Science | 45 | 56 | |
Bobby | Math | 78 | 45 |
Science | 89 | 67 | |
Cathrine | Math | 45 | 89 |
Science | 67 | 90 | |
Jack | Math | 67 | 56 |
Science | 44 | 55 |
In [37]:
stacked_df
Out[37]:
Semester1 | Semester2 | ||
---|---|---|---|
Alisa | Math | 12 | 67 |
Science | 45 | 56 | |
Bobby | Math | 78 | 45 |
Science | 89 | 67 | |
Cathrine | Math | 45 | 89 |
Science | 67 | 90 | |
Jack | Math | 67 | 56 |
Science | 44 | 55 |
In [38]:
stacked_df.unstack()
Out[38]:
Semester1 | Semester2 | |||
---|---|---|---|---|
Math | Science | Math | Science | |
Alisa | 12 | 45 | 67 | 56 |
Bobby | 78 | 89 | 45 | 67 |
Cathrine | 45 | 67 | 89 | 90 |
Jack | 67 | 44 | 56 | 55 |
In [40]:
stacked_df.unstack(level=0)
Out[40]:
Semester1 | Semester2 | |||||||
---|---|---|---|---|---|---|---|---|
Alisa | Bobby | Cathrine | Jack | Alisa | Bobby | Cathrine | Jack | |
Math | 12 | 78 | 45 | 67 | 67 | 45 | 89 | 56 |
Science | 45 | 89 | 67 | 44 | 56 | 67 | 90 | 55 |
In [41]:
stacked_df.unstack(level=1)
Out[41]:
Semester1 | Semester2 | |||
---|---|---|---|---|
Math | Science | Math | Science | |
Alisa | 12 | 45 | 67 | 56 |
Bobby | 78 | 89 | 45 | 67 |
Cathrine | 45 | 67 | 89 | 90 |
Jack | 67 | 44 | 56 | 55 |
In [42]:
stacked_df.unstack(level=-1)
Out[42]:
Semester1 | Semester2 | |||
---|---|---|---|---|
Math | Science | Math | Science | |
Alisa | 12 | 45 | 67 | 56 |
Bobby | 78 | 89 | 45 | 67 |
Cathrine | 45 | 67 | 89 | 90 |
Jack | 67 | 44 | 56 | 55 |
In [ ]: