【DS with Python】DataFrame的合并、分组聚合与数据透视表


前言

本节主要介绍数据处理过程中Pandas的常见模块与DataFrame的常见处理方法,建议参数问题可以查查pandas官网在API reference中有各个功能的详细参数与具体介绍


一、DataFrame的合并

1.1 按列名合并 (pd.merge())

  如果需要将两个DataFrame合并,我们可以用pandas中的merge功能

pd.merge(df1,df2,how='inner',on=None,left_index=False,right_index=False,left_on=None,right_on=None,suffixes=('_x', '_y'))

  • 常用的参数:

  df1df2是两个DataFrame,how是连接方式,on是按哪一列进行合并,也可以传入一个list,用Multi-index来合并,如果需要合并的列在两张表名字不同,可以用left_onright_on参数,如果想用index来合并,可以选择left_index=True或者right_index=True。如果两张表中的列名是一样的,新表中来自df1的列名会自动在最后添加'_x',来自df2的列名会自动在最后添加'_y',可以在suffixes中修改。

  • 如何合并?

  假设我们有两个DataFrame,分别是学生students和职工staff,那我们有几种合并方式?
在这里插入图片描述
  假设我们以Students为df1,staff为df2
  (注意:此处P2包含了Student的数据和Staff的数据,直白来说P1+P2不等于Student)
  1.只要交集部分P2,可以用内连接,how='inner'
  2.要整个图形P1+P2+P3, 可以用外连接,how='outer'
  3.只要包含所有学生部分P1+P2,可以用左连接,how='left'
  4.只要包含所有职工部分P2+P3,可以用右连接,how='right'

  例如,在学校中有的人既是老师,有是职工,我们想要得到所有的人员名单,可以用outer模式来合并,空值会用NaN代替:

import pandas as pd 
import numpy as np

staff_df=pd.DataFrame([{
   'Name':'Kelly','Role':'Director of HR'},
                      {
   'Name':'Mike','Role':'Course Liasion'},
                      {
   'Name':'Sally','Role':'Grader'},])
staff_df=staff_df.set_index('Name')
student_df = pd.DataFrame([{
   'Name':'James','School':'Business'},
                      {
   'Name':'Mike','School':'Law'},
                      {
   'Name':'Sally','School':'Engineering'}])
student_df=student_df.set_index('Name')

df1=pd.merge(staff_df,student_df,how='outer',left_index=True,right_index=True)
df1

在这里插入图片描述
  如果我们想要查看所有学生,并看看他们是否有教职,那就把student_df看作df1并用inner连接

df1=pd.merge(staff_df,student_df,how='inner',left_index=True,right_index=True)
df1

在这里插入图片描述
  如果学生有姓和名,可以用list来做on的参数连接

staff_df = pd.DataFrame([{
   'First Name': 'Kelly', 'Last Name': 'Desjardins', 
                          'Role': 'Director of HR'},
                         {
   'First Name': 'Sally', 'Last Name': 'Brooks', 
                          'Role': 'Course liasion'},
                         {
   'First Name': 'James', 'Last Name': 'Wilde', 
                          'Role': 'Grader'}])
student_df = pd.DataFrame([{
   'First Name': 'James', 'Last Name': 'Hammond', 
                            'School': 'Business'},
                           {
   'First Name': 'Mike', 'Last Name': 'Smith', 
                            'School': 'Law'},
                           {
   'First Name': 'Sally', 'Last Name': 'Brooks', 
                            'School': 'Engineering'}])
                            
pd.merge(staff_df, student_df, how='inner', on=['First Name','Last Name'])

在这里插入图片描述
  如果有两列的名字是相同的,df1的列名会添加_x,df2则添加_y,当然也可以在suffixes参数中调整例如suffixes=('_a','_b')

staff_df = pd.DataFrame([{
   'Name': 'Kelly', 'Role': 'Director of HR', 
                          'Location': 'State Street'},
                         {
   'Name': 'Sally', 'Role': 'Course liasion', 
                          'Location': 'Washington Avenue'},
                         {
   'Name': 'James', 'Role': 'Grader', 
                          'Location': 'Washington Avenue'}])
student_df = pd.DataFrame([{
   'Name': 'James', 'School': 'Business', 
                            'Location': '1024 Billiard Avenue'},
                           {
   'Name': 'Mike', 'School': 'Law', 
                            'Location': 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值