数据分析——从入门到精通(九)

import numpy as np
import pandas as pd
from pandas import Series,DataFrame,MultiIndex

数据级联

将两个DataFrame或Series进行拼接,按索引标签对齐

  • pd.conncat() 列拼接
  • pd.append() 行拼接
# 创建成绩表
df1 = DataFrame(np.random.randint(1,150,size=(6,3)),['甲','乙','丙','丁','戊','己'],['Python','Flask','FastAPI'])
df2 = DataFrame(np.random.randint(1,150,size=(6,3)),['甲','乙','丙','丁','A','B'],['Python','Tornado','Pulsar'])
display(df1,df2)
Python Flask FastAPI
86 91 125
114 73 41
20 90 37
96 84 134
47 78 22
80 43 90
Python Tornado Pulsar
13 29 3
103 12 81
21 101 62
24 26 121
A 76 106 134
B 33 23 104
"""
pd.concat(
    objs,
    axis=0,
    join='outer',
    join_axes=None,
    ignore_index=False,
    keys=None,
    levels=None,
    names=None,
    verify_integrity=False,
    sort=None,
    copy=True,
)
"""
# join : {'inner', 'outer'}, default 'outer'
# outer 表示保留全部的索引标签,inner只保留相同的标签
# 默认axis=0,行拼接,上下拼接的 (速记:上下为行,左右为列)
pd.concat((df1,df2),sort=False)
Python Flask FastAPI Tornado Pulsar
86 91.0 125.0 NaN NaN
114 73.0 41.0 NaN NaN
20 90.0 37.0 NaN NaN
96 84.0 134.0 NaN NaN
47 78.0 22.0 NaN NaN
80 43.0 90.0 NaN NaN
13 NaN NaN 29.0 3.0
103 NaN NaN 12.0 81.0
21 NaN NaN 101.0 62.0
24 NaN NaN 26.0 121.0
A 76 NaN NaN 106.0 134.0
B 33 NaN NaN 23.0 104.0
# outer 表示保留全部的索引标签,inner只保留相同的标签
pd.concat((df1,df2),join='inner',sort=False)
Python
86
114
20
96
47
80
13
103
21
24
A 76
B 33
"""
ignore_index : bool, default False
    If True, do not use the index values along the concatenation axis. The
    resulting axis will be labeled 0, ..., n - 1. This is useful if you are
    concatenating objects where the concatenation axis does not have
    meaningful indexing information. Note the index values on the other
    axes are still respected in the join.

"""
# ignore_index: True  重新创建索引标签
pd.concat((df1,df2),join='inner',ignore_index=True,sort=False)
Python
0 86
1 114
2 20
3 96
4 47
5 80
6 13
7 103
8 21
9 24
10 76
11 33
pd.concat((df1,df2),join='outer',ignore_index=False,sort=False)
Python Flask FastAPI Tornado Pulsar
86 91.0 125.0 NaN NaN
114 73.0 41.0 NaN NaN
20 90.0 37.0 NaN NaN
96 84.0 134.0 NaN NaN
47 78.0 22.0 NaN NaN
80 43.0 90.0 NaN NaN
13 NaN NaN 29.0 3.0
103 NaN NaN 12.0 81.0
21 NaN NaN 101.0 62.0
24 NaN NaN 26.0 121.0
A 76 NaN NaN 106.0 134.0
B 33 NaN NaN 23.0 104.0
# 默认keys=None  keys可以用来指定两表级联之后的每一个标签(索引)  ——(也可以理解为增加多层索引)
pd.concat((df1,df2),join='outer',ignore_index=False,keys=['期中','期末'],sort=False)
Python Flask FastAPI Tornado Pulsar
期中 86 91.0 125.0 NaN NaN
114 73.0 41.0 NaN NaN
20 90.0 37.0 NaN NaN
96 84.0 134.0 NaN NaN
47 78.0 22.0 NaN NaN
80 43.0 90.0 NaN NaN
期末 13 NaN NaN 29.0 3.0
103 NaN NaN 12.0 81.0
21 NaN NaN 101.0 62.0
24 NaN NaN 26.0 121.0
A 76 NaN NaN 106.0 134.0
B 33 NaN NaN 23.0 104.0
df3 =pd.concat((df1,df2),join='outer',ignore_index=False,keys=['期中','期末'],sort=False)
df3
Python Flask FastAPI Tornado Pulsar
期中 86 91.0 125.0 NaN NaN
114 73.0 41.0 NaN NaN
20 90.0 37.0 NaN NaN
96 84.0 134.0 NaN NaN
47 78.0 22.0 NaN NaN
80 43.0 90.0 NaN NaN
期末 13 NaN NaN 29.0 3.0
103 NaN NaN 12.0 81.0
21 NaN NaN 101.0 62.0
24 NaN NaN 26.0 121.0
A 76 NaN NaN 106.0 134.0
B 33 NaN NaN 23.0 104.0
df4 =df3.copy()
df4
Python Flask FastAPI Tornado Pulsar
期中 86 91.0 125.0 NaN NaN
114 73.0 41.0 NaN NaN
20 90.0 37.0 NaN NaN
96 84.0 134.0 NaN NaN
47 78.0 22.0 NaN NaN
80 43.0 90.0 NaN NaN
期末 13 NaN NaN 29.0 3.0
103 NaN NaN 12.0 81.0
21 NaN NaN 101.0 62.0
24 NaN NaN 26.0 121.0
A 76 NaN NaN 106.0 134.0
B 33 NaN NaN 23.0 104.0
pd.concat((df3,df4),levels=['期中','期末'],axis=1)
Python Flask FastAPI Tornado Pulsar Python Flask FastAPI Tornado Pulsar
期中 86 91.0 125.0 NaN NaN 86 91.0 125.0 NaN NaN
114 73.0 41.0 NaN NaN 114 73.0 41.0 NaN NaN
20 90.0 37.0 NaN NaN 20 90.0 37.0 NaN NaN
96 84.0 134.0 NaN NaN 96 84.0 134.0 NaN NaN
47 78.0 22.0 NaN NaN 47 78.0 22.0 NaN NaN
80 43.0 90.0 NaN NaN 80 43.0 90.0 NaN NaN
期末 13 NaN NaN 29.0 3.0 13 NaN NaN 29.0 3.0
103 NaN NaN 12.0 81.0 103 NaN NaN 12.0 81.0
21 NaN NaN 101.0 62.0 21 NaN NaN 101.0 62.0
24 NaN NaN 26.0 121.0 24 NaN NaN 26.0 121.0
A 76 NaN NaN 106.0 134.0 76 NaN NaN 106.0 134.0
B 33 NaN NaN 23.0 104.0 33 NaN NaN 23.0 104.0
pd.concat((df3,df4),axis=1) # 去掉levels=['期中','期末'] 也没影响
Python Flask FastAPI Tornado Pulsar Python Flask FastAPI Tornado Pulsar
期中 86 91.0 125.0 NaN NaN 86 91.0 125.0 NaN NaN
114 73.0 41.0 NaN NaN 114 73.0 41.0 NaN NaN
20 90.0 37.0 NaN NaN 20 90.0 37.0 NaN NaN
96 84.0 134.0 NaN NaN 96 84.0 134.0 NaN NaN
47 78.0 22.0 NaN NaN 47 78.0 22.0 NaN NaN
80 43.0 90.0 NaN NaN 80 43.0 90.0 NaN NaN
期末 13 NaN NaN 29.0 3.0 13 NaN NaN 29.0 3.0
103 NaN NaN 12.0 81.0 103 NaN NaN 12.0 81.0
21 NaN NaN 101.0 62.0 21 NaN NaN 101.0 62.0
24 NaN NaN 26.0 121.0 24 NaN NaN 26.0 121.0
A 76 NaN NaN 106.0 134.0 76 NaN NaN 106.0 134.0
B 33 NaN NaN 23.0 104.0 33 NaN NaN 23.0 104.0
pd.concat((df3,df4),levels=['中','末'],axis=1)  # levels=['中','末'] 没有作用
Python Flask FastAPI Tornado Pulsar Python Flask FastAPI Tornado Pulsar
期中 86 91.0 125.0 NaN NaN 86 91.0 125.0 NaN NaN
114 73.0 41.0 NaN NaN 114 73.0 41.0 NaN NaN
20 90.0 37.0 NaN NaN 20 90.0 37.0 NaN NaN
96 84.0 134.0 NaN NaN 96 84.0 134.0 NaN NaN
47 78.0 22.0 NaN NaN 47 78.0 22.0 NaN NaN
80 43.0 90.0 NaN NaN 80 43.0 90.0 NaN NaN
期末 13 NaN NaN 29.0 3.0 13 NaN NaN 29.0 3.0
103 NaN NaN 12.0 81.0 103 NaN NaN 12.0 81.0
21 NaN NaN 101.0 62.0 21 NaN NaN 101.0 62.0
24 NaN NaN 26.0 121.0 24 NaN NaN 26.0 121.0
A 76 NaN NaN 106.0 134.0 76 NaN NaN 106.0 134.0
B 33 NaN NaN 23.0 104.0 33 NaN NaN 23.0 104.0
pd.concat((df3,df4),axis=1)
Python Flask FastAPI Tornado Pulsar Python Flask FastAPI Tornado Pulsar
期中 86 91.0 125.0 NaN NaN 86 91.0 125.0 NaN NaN
114 73.0 41.0 NaN NaN 114 73.0 41.0 NaN NaN
20 90.0 37.0 NaN NaN 20 90.0 37.0 NaN NaN
96 84.0 134.0 NaN NaN 96 84.0 134.0 NaN NaN
47 78.0 22.0 NaN NaN 47 78.0 22.0 NaN NaN
80 43.0 90.0 NaN NaN 80 43.0 90.0 NaN NaN
期末 13 NaN NaN 29.0 3.0 13 NaN NaN 29.0 3.0
103 NaN NaN 12.0 81.0 103 NaN NaN 12.0 81.0
21 NaN NaN 101.0 62.0 21 NaN NaN 101.0 62.0
24 NaN NaN 26.0 121.0 24 NaN NaN 26.0 121.0
A 76 NaN NaN 106.0 134.0 76 NaN NaN 106.0 134.0
B 33 NaN NaN 23.0 104.0 33 NaN NaN 23.0 104.0
pd.concat((df3,df4),axis=1,keys=['2019年的第一学期','2019年的第二学期'])
2019年的第一学期 2019年的第二学期
Python Flask FastAPI Tornado Pulsar Python Flask FastAPI Tornado Pulsar
期中 86 91.0 125.0 NaN NaN 86 91.0 125.0 NaN NaN
114 73.0 41.0 NaN NaN 114 73.0 41.0 NaN NaN
20 90.0 37.0 NaN NaN 20 90.0 37.0 NaN NaN
96 84.0 134.0 NaN NaN 96 84.0 134.0 NaN NaN
47 78.0 22.0 NaN NaN 47 78.0 22.0 NaN NaN
80 43.0 90.0 NaN NaN 80 43.0 90.0 NaN NaN
期末 13 NaN NaN 29.0 3.0 13 NaN NaN 29.0 3.0
103 NaN NaN 12.0 81.0 103 NaN NaN 12.0 81.0
21 NaN NaN 101.0 62.0 21 NaN NaN 101.0 62.0
24 NaN NaN 26.0 121.0 24 NaN NaN 26.0 121.0
A 76 NaN NaN 106.0 134.0 76 NaN NaN 106.0 134.0
B 33 NaN NaN 23.0 104.0 33 NaN NaN 23.0 104.0
# 行拼接
df1.append(df2,sort=False)  # .append()方法创建df副本和other数据进行行拼接,列标签级联
Python Flask FastAPI Tornado Pulsar
86 91.0 125.0 NaN NaN
114 73.0 41.0 NaN NaN
20 90.0 37.0 NaN NaN
96 84.0 134.0 NaN NaN
47 78.0 22.0 NaN NaN
80 43.0 90.0 NaN NaN
13 NaN NaN 29.0 3.0
103 NaN NaN 12.0 81.0
21 NaN NaN 101.0 62.0
24 NaN NaN 26.0 121.0
A 76 NaN NaN 106.0 134.0
B 33 NaN NaN 23.0 104.0
df5 =df1.append(df2,ignore_index=True,sort=False) 
df5
Python Flask FastAPI Tornado Pulsar
0 86 91.0 125.0 NaN NaN
1 114 73.0 41.0 NaN NaN
2 20 90.0 37.0 NaN NaN
3 96 84.0 134.0 NaN NaN
4 47 78.0 22.0 NaN NaN
5 80 43.0 90.0 NaN NaN
6 13 NaN NaN 29.0 3.0
7 103 NaN NaN 12.0 81.0
8 21 NaN NaN 101.0 62.0
9 24 NaN NaN 26.0 121.0
10 76 NaN NaN 106.0 134.0
11 33 NaN NaN 23.0 104.0
df5.index     # RangeIndex 有序索引(序列索引),类型是int
RangeIndex(start=0, stop=12, step=1)
# 获取df5第三行数据
df5.loc[3]
Python      96.0
Flask       84.0
FastAPI    134.0
Tornado      NaN
Pulsar       NaN
Name: 3, dtype: float64
# 获取df5第四行数据
df5.loc[4]
Python     47.0
Flask      78.0
FastAPI    22.0
Tornado     NaN
Pulsar      NaN
Name: 4, dtype: float64
# 获取df5第五行数据
df5.loc[5]    # 如果索引标签是RangeIndex,通过.loc[]和iloc[]操作是相同的
Python     80.0
Flask      43.0
FastAPI    90.0
Tornado     NaN
Pulsar      NaN
Name: 5, dtype: float64

数据合并

将两个DataFrame表的数据进行合并,同mysql的join连接。

  • pd.merge()
# 创建分类表(id,name)
cate = DataFrame({
    'id':[i for i in range(1,6)],
    'name':['美食','音乐','视频','笑话','军事']
})
cate
id name
0 1 美食
1 2 音乐
2 3 视频
3 4 笑话
4 5 军事
import time 
# 创建内容表 content(id,title,cate_id)       id  标题   分类id
titles = [] 
cate_ids = []
for i in range(1,21):
    item = cate.loc[np.random.choice(cate.index)]  # series
    titles.append(f'{item["name"]}-{time.time()}')
    cate_ids.append(item['id'])
                  
content = DataFrame({
    'id':[i for i in range(1,21)],
    'title':titles,
    'cate_id':cate_ids
})
content
id title cate_id
0 1 军事-1649392870.4940078 5
1 2 美食-1649392870.4940078 1
2 3 视频-1649392870.4950054 3
3 4 视频-1649392870.4950054 3
4 5 音乐-1649392870.4950054 2
5 6 美食-1649392870.4950054 1
6 7 军事-1649392870.4950054 5
7 8 笑话-1649392870.496003 4
8 9 视频-1649392870.496003 3
9 10 音乐-1649392870.496003 2
10 11 军事-1649392870.496003 5
11 12 笑话-1649392870.4970002 4
12 13 笑话-1649392870.4970002 4
13 14 美食-1649392870.4970002 1
14 15 视频-1649392870.4970002 3
15 16 笑话-1649392870.4970002 4
16 17 美食-1649392870.4979968 1
17 18 军事-1649392870.4979968 5
18 19 音乐-1649392870.4979968 2
19 20 视频-1649392870.4979968 3
display(cate,content)
id name
0 1 美食
1 2 音乐
2 3 视频
3 4 笑话
4 5 军事
id title cate_id
0 1 军事-1649392870.4940078 5
1 2 美食-1649392870.4940078 1
2 3 视频-1649392870.4950054 3
3 4 视频-1649392870.4950054 3
4 5 音乐-1649392870.4950054 2
5 6 美食-1649392870.4950054 1
6 7 军事-1649392870.4950054 5
7 8 笑话-1649392870.496003 4
8 9 视频-1649392870.496003 3
9 10 音乐-1649392870.496003 2
10 11 军事-1649392870.496003 5
11 12 笑话-1649392870.4970002 4
12 13 笑话-1649392870.4970002 4
13 14 美食-1649392870.4970002 1
14 15 视频-1649392870.4970002 3
15 16 笑话-1649392870.4970002 4
16 17 美食-1649392870.4979968 1
17 18 军事-1649392870.4979968 5
18 19 音乐-1649392870.4979968 2
19 20 视频-1649392870.4979968 3
# content表只取前五个
display(cate,content.head())
id name
0 1 美食
1 2 音乐
2 3 视频
3 4 笑话
4 5 军事
id title cate_id
0 1 军事-1649392870.4940078 5
1 2 美食-1649392870.4940078 1
2 3 视频-1649392870.4950054 3
3 4 视频-1649392870.4950054 3
4 5 音乐-1649392870.4950054 2
pd.merge(cate,content)  # 默认以on='id'进行连接
# on : label or list   指定两个表哪一个字段(的内容)进行合并
id name title cate_id
0 1 美食 军事-1649392870.4940078 5
1 2 音乐 美食-1649392870.4940078 1
2 3 视频 视频-1649392870.4950054 3
3 4 笑话 视频-1649392870.4950054 3
4 5 军事 音乐-1649392870.4950054 2
pd.merge(cate,content,left_on='id',right_on='cate_id')
id_x name id_y title cate_id
0 1 美食 2 美食-1649392870.4940078 1
1 1 美食 6 美食-1649392870.4950054 1
2 1 美食 14 美食-1649392870.4970002 1
3 1 美食 17 美食-1649392870.4979968 1
4 2 音乐 5 音乐-1649392870.4950054 2
5 2 音乐 10 音乐-1649392870.496003 2
6 2 音乐 19 音乐-1649392870.4979968 2
7 3 视频 3 视频-1649392870.4950054 3
8 3 视频 4 视频-1649392870.4950054 3
9 3 视频 9 视频-1649392870.496003 3
10 3 视频 15 视频-1649392870.4970002 3
11 3 视频 20 视频-1649392870.4979968 3
12 4 笑话 8 笑话-1649392870.496003 4
13 4 笑话 12 笑话-1649392870.4970002 4
14 4 笑话 13 笑话-1649392870.4970002 4
15 4 笑话 16 笑话-1649392870.4970002 4
16 5 军事 1 军事-1649392870.4940078 5
17 5 军事 7 军事-1649392870.4950054 5
18 5 军事 11 军事-1649392870.496003 5
19 5 军事 18 军事-1649392870.4979968 5
pd.merge(cate,content,left_on='id',right_on='cate_id',suffixes=['_cate','_content'])
id_cate name id_content title cate_id
0 1 美食 2 美食-1649392870.4940078 1
1 1 美食 6 美食-1649392870.4950054 1
2 1 美食 14 美食-1649392870.4970002 1
3 1 美食 17 美食-1649392870.4979968 1
4 2 音乐 5 音乐-1649392870.4950054 2
5 2 音乐 10 音乐-1649392870.496003 2
6 2 音乐 19 音乐-1649392870.4979968 2
7 3 视频 3 视频-1649392870.4950054 3
8 3 视频 4 视频-1649392870.4950054 3
9 3 视频 9 视频-1649392870.496003 3
10 3 视频 15 视频-1649392870.4970002 3
11 3 视频 20 视频-1649392870.4979968 3
12 4 笑话 8 笑话-1649392870.496003 4
13 4 笑话 12 笑话-1649392870.4970002 4
14 4 笑话 13 笑话-1649392870.4970002 4
15 4 笑话 16 笑话-1649392870.4970002 4
16 5 军事 1 军事-1649392870.4940078 5
17 5 军事 7 军事-1649392870.4950054 5
18 5 军事 11 军事-1649392870.496003 5
19 5 军事 18 军事-1649392870.4979968 5
content
id title cate_id
0 1 军事-1649392870.4940078 5
1 2 美食-1649392870.4940078 1
2 3 视频-1649392870.4950054 3
3 4 视频-1649392870.4950054 3
4 5 音乐-1649392870.4950054 2
5 6 美食-1649392870.4950054 1
6 7 军事-1649392870.4950054 5
7 8 笑话-1649392870.496003 4
8 9 视频-1649392870.496003 3
9 10 音乐-1649392870.496003 2
10 11 军事-1649392870.496003 5
11 12 笑话-1649392870.4970002 4
12 13 笑话-1649392870.4970002 4
13 14 美食-1649392870.4970002 1
14 15 视频-1649392870.4970002 3
15 16 笑话-1649392870.4970002 4
16 17 美食-1649392870.4979968 1
17 18 军事-1649392870.4979968 5
18 19 音乐-1649392870.4979968 2
19 20 视频-1649392870.4979968 3
content.loc[3]
id                             4
title      视频-1649392870.4950054
cate_id                        3
Name: 3, dtype: object
# 更改content第四条的内容
content.loc[3,'cate_id'] = 6
content.head()
id title cate_id
0 1 军事-1649392870.4940078 5
1 2 美食-1649392870.4940078 1
2 3 视频-1649392870.4950054 3
3 4 视频-1649392870.4950054 6
4 5 音乐-1649392870.4950054 2
pd.merge(cate,content,left_on='id',right_on='cate_id',suffixes=['_cate','_content'])
id_cate name id_content title cate_id
0 1 美食 2 美食-1649392870.4940078 1
1 1 美食 6 美食-1649392870.4950054 1
2 1 美食 14 美食-1649392870.4970002 1
3 1 美食 17 美食-1649392870.4979968 1
4 2 音乐 5 音乐-1649392870.4950054 2
5 2 音乐 10 音乐-1649392870.496003 2
6 2 音乐 19 音乐-1649392870.4979968 2
7 3 视频 3 视频-1649392870.4950054 3
8 3 视频 9 视频-1649392870.496003 3
9 3 视频 15 视频-1649392870.4970002 3
10 3 视频 20 视频-1649392870.4979968 3
11 4 笑话 8 笑话-1649392870.496003 4
12 4 笑话 12 笑话-1649392870.4970002 4
13 4 笑话 13 笑话-1649392870.4970002 4
14 4 笑话 16 笑话-1649392870.4970002 4
15 5 军事 1 军事-1649392870.4940078 5
16 5 军事 7 军事-1649392870.4950054 5
17 5 军事 11 军事-1649392870.496003 5
18 5 军事 18 军事-1649392870.4979968 5
pd.merge(cate,content,left_on='id',right_on='cate_id',suffixes=['_cate','_content'],how='outer')
id_cate name id_content title cate_id
0 1.0 美食 2 美食-1649392870.4940078 1
1 1.0 美食 6 美食-1649392870.4950054 1
2 1.0 美食 14 美食-1649392870.4970002 1
3 1.0 美食 17 美食-1649392870.4979968 1
4 2.0 音乐 5 音乐-1649392870.4950054 2
5 2.0 音乐 10 音乐-1649392870.496003 2
6 2.0 音乐 19 音乐-1649392870.4979968 2
7 3.0 视频 3 视频-1649392870.4950054 3
8 3.0 视频 9 视频-1649392870.496003 3
9 3.0 视频 15 视频-1649392870.4970002 3
10 3.0 视频 20 视频-1649392870.4979968 3
11 4.0 笑话 8 笑话-1649392870.496003 4
12 4.0 笑话 12 笑话-1649392870.4970002 4
13 4.0 笑话 13 笑话-1649392870.4970002 4
14 4.0 笑话 16 笑话-1649392870.4970002 4
15 5.0 军事 1 军事-1649392870.4940078 5
16 5.0 军事 7 军事-1649392870.4950054 5
17 5.0 军事 11 军事-1649392870.496003 5
18 5.0 军事 18 军事-1649392870.4979968 5
19 NaN NaN 4 视频-1649392870.4950054 6

你可能感兴趣的:(数据分析,python,pandas,python,数据分析,大数据)