



实验:
第六课 数据分析工具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 [ ]:

165

被折叠的 条评论
为什么被折叠?



