栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【Python百日基础系列】Day18 - Pandas 数据合并、重塑与透视

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Python百日基础系列】Day18 - Pandas 数据合并、重塑与透视

文章目录
      • 准备数据集
  • 一、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

4.1 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'])
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表格类数据:多维数据
  • 数据库数据:一维数据
5.2 堆叠 df.stack() :数据降维,多维变一维,结果为Series
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)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/460932.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号