- 准备数据集
- 一、concat - 数据拼接
- 1.1 两个或多个df纵向拼接,列名对齐
- 1.2 两个或多个df纵向拼接,新增数据来源索引列
- 1.3 两个或多个df横向拼接,索引对齐
- 1.4 两个或多个df横向拼接,内联取交集
- 1.5 两个或多个df横向拼接,取指定索引
- 二、merge - 数据横向连接
- 2.1 保留所有数据,outer
- 2.2 保留左表数据,left
- 2.3 保留右表数据,right
- 2.4 保留交集数据,inner
- 2.5 指定重复列名的修改方式
- 三、join - 数据横向连接,merge的简化版
- 3.1 基本join操作:按索引左对齐
- 3.2 join操作禁忌
- 3.2.1 join操作禁忌1:索引不一致,右表数据取不到
- 3.2.2 join操作禁忌2:数据列名重复,需指定lsuffix和rsuffix
- 四、append - 添加行,特别注意索引
- 4.1 append添加一维列表data
- 4.2 append添加二维列表data
- 4.3 append添加字典data
- 4.4 append添加字典Series
- 4.4 append添加字典Dataframe,按列对齐,相当于concat的简化
- 五、stack / unstack 数据重塑
- 5.1 一维数据和多维数据
- 5.2 堆叠 df.stack() :数据降维,多维变一维,结果为Series
- 5.3 拆堆 Series.unstack():数据升维,一维变多维,结果为Dataframe
- 六、pivot / pivot_table 数据透视
视频讲解:
【Python百日基础系列】Pandas 数据合并重塑与透视
准备数据集import pandas as pd
df = pd.read_csv('data.csv' , usecols=['positionId', 'positionName', 'companyId', 'createTime','salary'])
df.columns = ['ID', '职位', '注册资金', '时间','薪资']
# 隔5个取一个
df1 = df.loc[1:5]
df1 = df1.drop('注册资金', axis=1)
df2 = df.loc[[1,3,5,7,9]]
df2.drop('时间', axis=1, inplace=True)
print(df1)
print(df2)
输出结果:
ID 职位 时间 薪资
1 5204912 数据建模 2020/3/16 11:08 15000
2 6877668 数据分析 2020/3/16 10:33 3500
3 6496141 数据分析 2020/3/16 10:10 45000
4 6467417 数据分析 2020/3/16 9:56 30000
5 6882347 数据分析 2020/3/16 9:54 50000
ID 职位 注册资金 薪资
1 5204912 数据建模 50735 15000
3 6496141 数据分析 26564 45000
5 6882347 数据分析 94826 50000
7 6764018 数据建模工程师 13163 35000
9 6786904 数据分析师 13163 40000
一、concat - 数据拼接
1.1 两个或多个df纵向拼接,列名对齐
df3 = pd.concat([df1, df2]) df3 = pd.concat([df1, df2, df1]) print(df3)1.2 两个或多个df纵向拼接,新增数据来源索引列
df3 = pd.concat([df1, df2], keys=['from_df1', 'from_df2']) print(df3)1.3 两个或多个df横向拼接,索引对齐
df3 = pd.concat([df1, df2], axis=1) df3 = pd.concat([df1, df2, df1], axis=1) print(df3) print(df3.shape)1.4 两个或多个df横向拼接,内联取交集
df3 = pd.concat([df1, df2], axis=1, join='inner') print(df3)1.5 两个或多个df横向拼接,取指定索引
df3 = pd.concat([df1, df2], axis=1).reindex([1,2,3]) df3 = pd.concat([df1, df2], axis=1).reindex(df1.index) df3 = pd.concat([df1, df2], axis=1).reindex(df2.index) print(df3)二、merge - 数据横向连接 2.1 保留所有数据,outer
df3 = pd.merge(df1, df2, how='outer', on='ID') df3 = pd.merge(df1, df2, how='outer', left_on='ID', right_on='ID') print(df3)2.2 保留左表数据,left
df3 = pd.merge(df1, df2, how='left', on=['ID', '职位']) df3 = pd.merge(df1, df2, how='left', left_on=['ID', '职位'], right_on=['ID', '职位']) print(df3)2.3 保留右表数据,right
df4 = pd.merge(df1, df2, how='right', on=['ID', '职位']) df4 = pd.merge(df1, df2, how='right', left_on=['ID', '职位'], right_on=['ID', '职位']) print(df4)2.4 保留交集数据,inner
df4 = pd.merge(df1, df2, how='inner', on=['ID', '职位']) df4 = pd.merge(df1, df2, how='inner', left_on=['ID', '职位'], right_on=['ID', '职位']) print(df4)2.5 指定重复列名的修改方式
df4 = pd.merge(df1, df2, how='inner', on=['ID', '职位'], suffixes=['_左', '_右']) print(df4)三、join - 数据横向连接,merge的简化版
merge包含了join操作,支持两个df列拼接,而join只是简化了merge的行拼接的操作
3.1 基本join操作:按索引左对齐import pandas as pd
df = pd.read_csv('data.csv' , usecols=['positionId', 'positionName', 'companyId', 'createTime','salary'])
df.columns = ['ID', '职位', '注册资金', '时间','薪资']
df1 = df.loc[1:5][['ID', '职位']]
df2 = df.loc[[1,3,5,7,9]][['注册资金', '时间','薪资']]
print(df1)
print(df2)
print(df1.join(df2))
3.2 join操作禁忌
3.2.1 join操作禁忌1:索引不一致,右表数据取不到
import pandas as pd
df = pd.read_csv('data.csv' , usecols=['positionId', 'positionName', 'companyId', 'createTime','salary'])
df.columns = ['ID', '职位', '注册资金', '时间','薪资']
df1 = df.loc[1:5][['ID', '职位']]
df2 = df.loc[[1,3,5,7,9]][['注册资金', '时间','薪资']]
df1.index = list('abced')
print(df1)
print(df2)
print(df1.join(df2))
3.2.2 join操作禁忌2:数据列名重复,需指定lsuffix和rsuffix
import pandas as pd
df = pd.read_csv('data.csv' , usecols=['positionId', 'positionName', 'companyId', 'createTime','salary'])
df.columns = ['ID', '职位', '注册资金', '时间','薪资']
df1 = df.loc[1:5][['ID', '职位', '注册资金']]
df2 = df.loc[[1,3,5,7,9]][['注册资金', '时间','薪资']]
print(df1)
print(df2)
print(df1.join(df2))
print(df1.join(df2, lsuffix='_左', rsuffix='_右'))
四、append - 添加行,特别注意索引
语法:df.append(data, ignore_index=False)
其中data可是是列表、字典、Series或Dataframe
import pandas as pd
df = pd.read_csv('data.csv' , usecols=['positionId', 'positionName', 'companyId', 'createTime','salary'])
df.columns = ['ID', '职位', '注册资金', '时间','薪资']
df = df.loc[1:5]
df.index = list('abcde')
df = df.append(['a'])
df = df.append(['a','b','c'])
df = df.append(['d','e','f'], ignore_index=True)
print(df)
4.2 append添加二维列表data
import pandas as pd
df = pd.read_csv('data.csv' , usecols=['positionId', 'positionName', 'companyId', 'createTime','salary'])
df.columns = ['ID', '职位', '注册资金', '时间','薪资']
df = df.loc[1:5]
df.index = list('abcde')
df = df.append([['a','b','c']])
df = df.append([['c', 'd','e','f']], ignore_index=True)
print(df)
4.3 append添加字典data
- 注意:必须加 ignore_index=True,并且可能会改变原列的数据类型
import pandas as pd
df = pd.read_csv('data.csv' ,
usecols=['positionId', 'positionName', 'companyId', 'createTime','salary'],
parse_dates=['createTime'])
df.columns = ['ID', '职位', '注册资金', '时间','薪资']
print(df.dtypes)
df = df.loc[1:5]
df.index = list('abcde')
# df = df.append({'ID':'a', '时间':'b'})
df = df.append({'ID':'a', '时间':'b'}, ignore_index=True)
print(df)
print(df.dtypes)
4.4 append添加字典Series
- Series的index列和数据列就相当于一个字典,所以和字典注意事项相同
- 必须加 ignore_index=True,并且可能会改变原列的数据类型
import pandas as pd
df = pd.read_csv('data.csv' ,
usecols=['positionId', 'positionName', 'companyId', 'createTime','salary'],
parse_dates=['createTime'])
df.columns = ['ID', '职位', '注册资金', '时间','薪资']
print(df.dtypes)
df = df.loc[1:5]
df.index = list('abcde')
df = df.append(pd.Series({'ID':'a', '时间':'b'}), ignore_index=True)
print(df)
print(df.dtypes)
4.4 append添加字典Dataframe,按列对齐,相当于concat的简化
import pandas as pd
df = pd.read_csv('data.csv' ,
usecols=['positionId', 'positionName', 'companyId', 'createTime','salary'],
parse_dates=['createTime'])
df.columns = ['ID', '职位', '注册资金', '时间','薪资']
print(df.dtypes)
df1 = df.loc[1:5]
df2 = df.loc[8:10]
df3 = df1.append(df2)
df4 = pd.concat([df1, df2])
print(df3)
print(df4)
五、stack / unstack 数据重塑
5.1 一维数据和多维数据
常见的数据的层次化结构有两种:
- Excel表格类数据:多维数据
- 数据库数据:一维数据
import pandas as pd
df = pd.read_csv('data.csv' ,
usecols=['positionId', 'positionName', 'companyId', 'createTime','salary'],
parse_dates=['createTime'])
df.columns = ['ID', '职位', '注册资金', '时间','薪资']
df = df.loc[1:5]
print(df)
df = df.stack()
print(type(df))
print(df)
print(df.index)
print(df.values)
5.3 拆堆 Series.unstack():数据升维,一维变多维,结果为Dataframe
import pandas as pd
df = pd.read_csv('data.csv' ,
usecols=['positionId', 'positionName', 'companyId', 'createTime','salary'],
parse_dates=['createTime'])
df.columns = ['ID', '职位', '注册资金', '时间','薪资']
df = df.loc[1:5]
print(df)
se = df.stack()
print(se)
df = se.unstack()
print(df)
六、pivot / pivot_table 数据透视
透视表是一种可以对数据动态排布并且分类汇总的表格格式。
或许大多数人都在Excel使用过数据透视表,也体会到它的强大功能.
pandas中它被称作 df.pivot() 或 df.pivot_table()
import pandas as pd
df = pd.read_csv('data.csv' ,
usecols=['positionId', 'positionName', 'createTime','salary'],
parse_dates=['createTime'])
df.columns = ['ID', '职位', '时间','薪资']
df = df.loc[1:5]
print(df)
# df = df.pivot(index='ID', columns='职位', values='薪资')
df = df.pivot_table(index='ID', columns='职位', values='薪资')
print(df)



