Pandas 学习笔记之合并篇#

一些准备工作#

[12]:
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import seaborn as sns
# 辅助函数
def get_movie_df():
    """
    获得 movie dataframe
    """
    return pd.read_csv('datas/movies.csv', sep='\t', encoding='utf-8',thousands=',',escapechar='$')

def get_titanic_df():
    return pd.read_csv('datas/titanic.csv')

def get_iris_df():
    return pd.read_csv('datas/iris.csv')

def get_tips_df():
    return pd.read_csv('datas/tips.csv')

def get_random_df():
    return pd.DataFrame(
        np.random.randn(6, 4),
        index=pd.date_range('20200101', periods=6),
        columns=list('ABCD'))

append#

[13]:
df_a = get_random_df()
df_b = get_random_df()
df_a.append(df_b)
/tmp/ipykernel_291582/1209409377.py:3: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
  df_a.append(df_b)
[13]:
A B C D
2020-01-01 -0.269572 -0.349617 0.442294 -0.882195
2020-01-02 -1.709286 0.548086 -0.502888 -0.708837
2020-01-03 -0.832589 0.489713 -0.129485 1.279461
2020-01-04 0.188869 1.105419 1.761396 -1.470213
2020-01-05 0.939380 -0.376033 1.462071 -0.611808
2020-01-06 1.348411 0.733179 -0.649799 -1.249644
2020-01-01 3.038264 1.019215 -0.547851 -0.994385
2020-01-02 0.016865 0.513501 0.526591 -1.633305
2020-01-03 0.495434 0.224371 -0.106351 1.198325
2020-01-04 -0.555650 -0.934830 1.353663 0.383852
2020-01-05 0.834052 -0.554621 0.488750 -0.346074
2020-01-06 1.532227 -0.052461 0.452420 -0.040312

join#

[14]:
# 列名相同的话,要指定后缀
df_a.join(df_b, lsuffix='_left')
[14]:
A_left B_left C_left D_left A B C D
2020-01-01 -0.269572 -0.349617 0.442294 -0.882195 3.038264 1.019215 -0.547851 -0.994385
2020-01-02 -1.709286 0.548086 -0.502888 -0.708837 0.016865 0.513501 0.526591 -1.633305
2020-01-03 -0.832589 0.489713 -0.129485 1.279461 0.495434 0.224371 -0.106351 1.198325
2020-01-04 0.188869 1.105419 1.761396 -1.470213 -0.555650 -0.934830 1.353663 0.383852
2020-01-05 0.939380 -0.376033 1.462071 -0.611808 0.834052 -0.554621 0.488750 -0.346074
2020-01-06 1.348411 0.733179 -0.649799 -1.249644 1.532227 -0.052461 0.452420 -0.040312

concat#

[15]:
# 纵向合并
pd.concat([df_a, df_b])
[15]:
A B C D
2020-01-01 -0.269572 -0.349617 0.442294 -0.882195
2020-01-02 -1.709286 0.548086 -0.502888 -0.708837
2020-01-03 -0.832589 0.489713 -0.129485 1.279461
2020-01-04 0.188869 1.105419 1.761396 -1.470213
2020-01-05 0.939380 -0.376033 1.462071 -0.611808
2020-01-06 1.348411 0.733179 -0.649799 -1.249644
2020-01-01 3.038264 1.019215 -0.547851 -0.994385
2020-01-02 0.016865 0.513501 0.526591 -1.633305
2020-01-03 0.495434 0.224371 -0.106351 1.198325
2020-01-04 -0.555650 -0.934830 1.353663 0.383852
2020-01-05 0.834052 -0.554621 0.488750 -0.346074
2020-01-06 1.532227 -0.052461 0.452420 -0.040312
[16]:
# 横向合并
pd.concat([df_a, df_b], axis=1)
[16]:
A B C D A B C D
2020-01-01 -0.269572 -0.349617 0.442294 -0.882195 3.038264 1.019215 -0.547851 -0.994385
2020-01-02 -1.709286 0.548086 -0.502888 -0.708837 0.016865 0.513501 0.526591 -1.633305
2020-01-03 -0.832589 0.489713 -0.129485 1.279461 0.495434 0.224371 -0.106351 1.198325
2020-01-04 0.188869 1.105419 1.761396 -1.470213 -0.555650 -0.934830 1.353663 0.383852
2020-01-05 0.939380 -0.376033 1.462071 -0.611808 0.834052 -0.554621 0.488750 -0.346074
2020-01-06 1.348411 0.733179 -0.649799 -1.249644 1.532227 -0.052461 0.452420 -0.040312

merge#

  • left与right:两个不同的DataFrame

  • how:指的是合并(连接)的方式有inner(内连接),left(左外连接),right(右外连接),outer(全外连接);默认为inner

  • on : 指的是用于连接的列索引名称。必须存在右右两个DataFrame对象中,如果没有指定且其他参数也未指定则以两个DataFrame的列名交集做为连接键

  • left_on:左则DataFrame中用作连接键的列名;这个参数中左右列名不相同,但代表的含义相同时非常有用。

  • right_on:右则DataFrame中用作 连接键的列名

  • left_index:使用左则DataFrame中的行索引做为连接键

  • right_index:使用右则DataFrame中的行索引做为连接键

  • sort:默认为True,将合并的数据进行排序。在大多数情况下设置为False可以提高性能

  • suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为(’_x’,’_y’)

  • copy:默认为True,总是将数据复制到数据结构中;大多数情况下设置为False可以提高性能

  • indicator:在 0.17.0中还增加了一个显示合并数据中来源情况;如只来自己于左边(left_only)、两者(both)

[17]:
data1 = {
    'id': ['001','002','003', '004'],
    'xm': ['小明', '小王', '小李', '小明'],
    'xb': ['男', '男', '男', '女'],
}
data2 = {
    'id': ['001','002','003'],
    '数学': [100, 95, 99],
}
df1 = DataFrame(data1)
df2 = DataFrame(data2)
pd.merge(df1, df2)
[17]:
id xm xb 数学
0 001 小明 100
1 002 小王 95
2 003 小李 99
[18]:
# 使用多个 key
data2 = {
    'xm': ['小王', '小李', '小明'],
    'xb': ['男', '男', '女'],
}
df2 = DataFrame(data2)
pd.merge(df1, df2, on=['xm', 'xb'])
[18]:
id xm xb
0 002 小王
1 003 小李
2 004 小明
[19]:
pd.merge(df1, df2, on=['xm', 'xb'], how='left')
[19]:
id xm xb
0 001 小明
1 002 小王
2 003 小李
3 004 小明
[20]:
# 指定合并的 key
data1 = {
    '序号': ['001','002','003', '004'],
    'xm': ['小明', '小王', '小李', '小明'],
    'xb': ['男', '男', '男', '女'],
}
data2 = {
    'id': ['001','002','003'],
    '数学': [100, 95, 99],
}
df1 = DataFrame(data1)
df2 = DataFrame(data2)
pd.merge(df1, df2, left_on='序号', right_on='id')
[20]:
序号 xm xb id 数学
0 001 小明 001 100
1 002 小王 002 95
2 003 小李 003 99
[21]:
pd.merge(df1, df2, left_on='序号', right_on='id', how='left')
[21]:
序号 xm xb id 数学
0 001 小明 001 100.0
1 002 小王 002 95.0
2 003 小李 003 99.0
3 004 小明 NaN NaN

合并 Series#

[22]:
s_name = pd.Series(
    data=['小明', '小王', '小李', '小明'],
    index=['001','002','003', '004']
)
s_math = pd.Series(
    data=[100, 95, 99],
    index=['001','002','003']
)
pd.concat([s_name, s_math])
[22]:
001     小明
002     小王
003     小李
004     小明
001    100
002     95
003     99
dtype: object
[23]:
pd.concat([s_name, s_math], axis=1)
[23]:
0 1
001 小明 100.0
002 小王 95.0
003 小李 99.0
004 小明 NaN