文章目录
前言
本节主要介绍数据处理过程中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'))
- 常用的参数:
df1
和df2
是两个DataFrame,how是连接方式,on
是按哪一列进行合并,也可以传入一个list,用Multi-index来合并,如果需要合并的列在两张表名字不同,可以用left_on
和right_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':