Pandas 学习笔记之合并篇#
版本号: 0.1
创建时间: 2024年03月12日
修改时间: 2024年03月12日
数据来源:
movies.csv http://boxofficemojo.com/daily/
titanic.csv https://github.com/dsaber/py-viz-blog
tips.csv https://github.com/pandas-dev/pandas/blob/master/doc/data/tips.csv
一些准备工作#
[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 |