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

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)
PythonFlaskFastAPI
8691125
1147341
209037
9684134
477822
804390
PythonTornadoPulsar
13293
1031281
2110162
2426121
A76106134
B3323104
"""
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)
PythonFlaskFastAPITornadoPulsar
8691.0125.0NaNNaN
11473.041.0NaNNaN
2090.037.0NaNNaN
9684.0134.0NaNNaN
4778.022.0NaNNaN
8043.090.0NaNNaN
13NaNNaN29.03.0
103NaNNaN12.081.0
21NaNNaN101.062.0
24NaNNaN26.0121.0
A76NaNNaN106.0134.0
B33NaNNaN23.0104.0
# outer 表示保留全部的索引标签,inner只保留相同的标签
pd.concat((df1,df2),join='inner',sort=False)
Python
86
114
20
96
47
80
13
103
21
24
A76
B33
"""
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
086
1114
220
396
447
580
613
7103
821
924
1076
1133
pd.concat((df1,df2),join='outer',ignore_index=False,sort=False)
PythonFlaskFastAPITornadoPulsar
8691.0125.0NaNNaN
11473.041.0NaNNaN
2090.037.0NaNNaN
9684.0134.0NaNNaN
4778.022.0NaNNaN
8043.090.0NaNNaN
13NaNNaN29.03.0
103NaNNaN12.081.0
21NaNNaN101.062.0
24NaNNaN26.0121.0
A76NaNNaN106.0134.0
B33NaNNaN23.0104.0
# 默认keys=None  keys可以用来指定两表级联之后的每一个标签(索引)  ——(也可以理解为增加多层索引)
pd.concat((df1,df2),join='outer',ignore_index=False,keys=['期中','期末'],sort=False)
PythonFlaskFastAPITornadoPulsar
期中8691.0125.0NaNNaN
11473.041.0NaNNaN
2090.037.0NaNNaN
9684.0134.0NaNNaN
4778.022.0NaNNaN
8043.090.0NaNNaN
期末13NaNNaN29.03.0
103NaNNaN12.081.0
21NaNNaN101.062.0
24NaNNaN26.0121.0
A76NaNNaN106.0134.0
B33NaNNaN23.0104.0
df3 =pd.concat((df1,df2),join='outer',ignore_index=False,keys=['期中','期末'],sort=False)
df3
PythonFlaskFastAPITornadoPulsar
期中8691.0125.0NaNNaN
11473.041.0NaNNaN
2090.037.0NaNNaN
9684.0134.0NaNNaN
4778.022.0NaNNaN
8043.090.0NaNNaN
期末13NaNNaN29.03.0
103NaNNaN12.081.0
21NaNNaN101.062.0
24NaNNaN26.0121.0
A76NaNNaN106.0134.0
B33NaNNaN23.0104.0
df4 =df3.copy()
df4
PythonFlaskFastAPITornadoPulsar
期中8691.0125.0NaNNaN
11473.041.0NaNNaN
2090.037.0NaNNaN
9684.0134.0NaNNaN
4778.022.0NaNNaN
8043.090.0NaNNaN
期末13NaNNaN29.03.0
103NaNNaN12.081.0
21NaNNaN101.062.0
24NaNNaN26.0121.0
A76NaNNaN106.0134.0
B33NaNNaN23.0104.0
pd.concat((df3,df4),levels=['期中','期末'],axis=1)
PythonFlaskFastAPITornadoPulsarPythonFlaskFastAPITornadoPulsar
期中8691.0125.0NaNNaN8691.0125.0NaNNaN
11473.041.0NaNNaN11473.041.0NaNNaN
2090.037.0NaNNaN2090.037.0NaNNaN
9684.0134.0NaNNaN9684.0134.0NaNNaN
4778.022.0NaNNaN4778.022.0NaNNaN
8043.090.0NaNNaN8043.090.0NaNNaN
期末13NaNNaN29.03.013NaNNaN29.03.0
103NaNNaN12.081.0103NaNNaN12.081.0
21NaNNaN101.062.021NaNNaN101.062.0
24NaNNaN26.0121.024NaNNaN26.0121.0
A76NaNNaN106.0134.076NaNNaN106.0134.0
B33NaNNaN23.0104.033NaNNaN23.0104.0
pd.concat((df3,df4),axis=1) # 去掉levels=['期中','期末'] 也没影响
PythonFlaskFastAPITornadoPulsarPythonFlaskFastAPITornadoPulsar
期中8691.0125.0NaNNaN8691.0125.0NaNNaN
11473.041.0NaNNaN11473.041.0NaNNaN
2090.037.0NaNNaN2090.037.0NaNNaN
9684.0134.0NaNNaN9684.0134.0NaNNaN
4778.022.0NaNNaN4778.022.0NaNNaN
8043.090.0NaNNaN8043.090.0NaNNaN
期末13NaNNaN29.03.013NaNNaN29.03.0
103NaNNaN12.081.0103NaNNaN12.081.0
21NaNNaN101.062.021NaNNaN101.062.0
24NaNNaN26.0121.024NaNNaN26.0121.0
A76NaNNaN106.0134.076NaNNaN106.0134.0
B33NaNNaN23.0104.033NaNNaN23.0104.0
pd.concat((df3,df4),levels=['中','末'],axis=1)  # levels=['中','末'] 没有作用
PythonFlaskFastAPITornadoPulsarPythonFlaskFastAPITornadoPulsar
期中8691.0125.0NaNNaN8691.0125.0NaNNaN
11473.041.0NaNNaN11473.041.0NaNNaN
2090.037.0NaNNaN2090.037.0NaNNaN
9684.0134.0NaNNaN9684.0134.0NaNNaN
4778.022.0NaNNaN4778.022.0NaNNaN
8043.090.0NaNNaN8043.090.0NaNNaN
期末13NaNNaN29.03.013NaNNaN29.03.0
103NaNNaN12.081.0103NaNNaN12.081.0
21NaNNaN101.062.021NaNNaN101.062.0
24NaNNaN26.0121.024NaNNaN26.0121.0
A76NaNNaN106.0134.076NaNNaN106.0134.0
B33NaNNaN23.0104.033NaNNaN23.0104.0
pd.concat((df3,df4),axis=1)
PythonFlaskFastAPITornadoPulsarPythonFlaskFastAPITornadoPulsar
期中8691.0125.0NaNNaN8691.0125.0NaNNaN
11473.041.0NaNNaN11473.041.0NaNNaN
2090.037.0NaNNaN2090.037.0NaNNaN
9684.0134.0NaNNaN9684.0134.0NaNNaN
4778.022.0NaNNaN4778.022.0NaNNaN
8043.090.0NaNNaN8043.090.0NaNNaN
期末13NaNNaN29.03.013NaNNaN29.03.0
103NaNNaN12.081.0103NaNNaN12.081.0
21NaNNaN101.062.021NaNNaN101.062.0
24NaNNaN26.0121.024NaNNaN26.0121.0
A76NaNNaN106.0134.076NaNNaN106.0134.0
B33NaNNaN23.0104.033NaNNaN23.0104.0
pd.concat((df3,df4),axis=1,keys=['2019年的第一学期','2019年的第二学期'])
2019年的第一学期2019年的第二学期
PythonFlaskFastAPITornadoPulsarPythonFlaskFastAPITornadoPulsar
期中8691.0125.0NaNNaN8691.0125.0NaNNaN
11473.041.0NaNNaN11473.041.0NaNNaN
2090.037.0NaNNaN2090.037.0NaNNaN
9684.0134.0NaNNaN9684.0134.0NaNNaN
4778.022.0NaNNaN4778.022.0NaNNaN
8043.090.0NaNNaN8043.090.0NaNNaN
期末13NaNNaN29.03.013NaNNaN29.03.0
103NaNNaN12.081.0103NaNNaN12.081.0
21NaNNaN101.062.021NaNNaN101.062.0
24NaNNaN26.0121.024NaNNaN26.0121.0
A76NaNNaN106.0134.076NaNNaN106.0134.0
B33NaNNaN23.0104.033NaNNaN23.0104.0
# 行拼接
df1.append(df2,sort=False)  # .append()方法创建df副本和other数据进行行拼接,列标签级联
PythonFlaskFastAPITornadoPulsar
8691.0125.0NaNNaN
11473.041.0NaNNaN
2090.037.0NaNNaN
9684.0134.0NaNNaN
4778.022.0NaNNaN
8043.090.0NaNNaN
13NaNNaN29.03.0
103NaNNaN12.081.0
21NaNNaN101.062.0
24NaNNaN26.0121.0
A76NaNNaN106.0134.0
B33NaNNaN23.0104.0
df5 =df1.append(df2,ignore_index=True,sort=False) 
df5
PythonFlaskFastAPITornadoPulsar
08691.0125.0NaNNaN
111473.041.0NaNNaN
22090.037.0NaNNaN
39684.0134.0NaNNaN
44778.022.0NaNNaN
58043.090.0NaNNaN
613NaNNaN29.03.0
7103NaNNaN12.081.0
821NaNNaN101.062.0
924NaNNaN26.0121.0
1076NaNNaN106.0134.0
1133NaNNaN23.0104.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
idname
01美食
12音乐
23视频
34笑话
45军事
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
idtitlecate_id
01军事-1649392870.49400785
12美食-1649392870.49400781
23视频-1649392870.49500543
34视频-1649392870.49500543
45音乐-1649392870.49500542
56美食-1649392870.49500541
67军事-1649392870.49500545
78笑话-1649392870.4960034
89视频-1649392870.4960033
910音乐-1649392870.4960032
1011军事-1649392870.4960035
1112笑话-1649392870.49700024
1213笑话-1649392870.49700024
1314美食-1649392870.49700021
1415视频-1649392870.49700023
1516笑话-1649392870.49700024
1617美食-1649392870.49799681
1718军事-1649392870.49799685
1819音乐-1649392870.49799682
1920视频-1649392870.49799683
display(cate,content)
idname
01美食
12音乐
23视频
34笑话
45军事
idtitlecate_id
01军事-1649392870.49400785
12美食-1649392870.49400781
23视频-1649392870.49500543
34视频-1649392870.49500543
45音乐-1649392870.49500542
56美食-1649392870.49500541
67军事-1649392870.49500545
78笑话-1649392870.4960034
89视频-1649392870.4960033
910音乐-1649392870.4960032
1011军事-1649392870.4960035
1112笑话-1649392870.49700024
1213笑话-1649392870.49700024
1314美食-1649392870.49700021
1415视频-1649392870.49700023
1516笑话-1649392870.49700024
1617美食-1649392870.49799681
1718军事-1649392870.49799685
1819音乐-1649392870.49799682
1920视频-1649392870.49799683
# content表只取前五个
display(cate,content.head())
idname
01美食
12音乐
23视频
34笑话
45军事
idtitlecate_id
01军事-1649392870.49400785
12美食-1649392870.49400781
23视频-1649392870.49500543
34视频-1649392870.49500543
45音乐-1649392870.49500542
pd.merge(cate,content)  # 默认以on='id'进行连接
# on : label or list   指定两个表哪一个字段(的内容)进行合并
idnametitlecate_id
01美食军事-1649392870.49400785
12音乐美食-1649392870.49400781
23视频视频-1649392870.49500543
34笑话视频-1649392870.49500543
45军事音乐-1649392870.49500542
pd.merge(cate,content,left_on='id',right_on='cate_id')
id_xnameid_ytitlecate_id
01美食2美食-1649392870.49400781
11美食6美食-1649392870.49500541
21美食14美食-1649392870.49700021
31美食17美食-1649392870.49799681
42音乐5音乐-1649392870.49500542
52音乐10音乐-1649392870.4960032
62音乐19音乐-1649392870.49799682
73视频3视频-1649392870.49500543
83视频4视频-1649392870.49500543
93视频9视频-1649392870.4960033
103视频15视频-1649392870.49700023
113视频20视频-1649392870.49799683
124笑话8笑话-1649392870.4960034
134笑话12笑话-1649392870.49700024
144笑话13笑话-1649392870.49700024
154笑话16笑话-1649392870.49700024
165军事1军事-1649392870.49400785
175军事7军事-1649392870.49500545
185军事11军事-1649392870.4960035
195军事18军事-1649392870.49799685
pd.merge(cate,content,left_on='id',right_on='cate_id',suffixes=['_cate','_content'])
id_catenameid_contenttitlecate_id
01美食2美食-1649392870.49400781
11美食6美食-1649392870.49500541
21美食14美食-1649392870.49700021
31美食17美食-1649392870.49799681
42音乐5音乐-1649392870.49500542
52音乐10音乐-1649392870.4960032
62音乐19音乐-1649392870.49799682
73视频3视频-1649392870.49500543
83视频4视频-1649392870.49500543
93视频9视频-1649392870.4960033
103视频15视频-1649392870.49700023
113视频20视频-1649392870.49799683
124笑话8笑话-1649392870.4960034
134笑话12笑话-1649392870.49700024
144笑话13笑话-1649392870.49700024
154笑话16笑话-1649392870.49700024
165军事1军事-1649392870.49400785
175军事7军事-1649392870.49500545
185军事11军事-1649392870.4960035
195军事18军事-1649392870.49799685
content
idtitlecate_id
01军事-1649392870.49400785
12美食-1649392870.49400781
23视频-1649392870.49500543
34视频-1649392870.49500543
45音乐-1649392870.49500542
56美食-1649392870.49500541
67军事-1649392870.49500545
78笑话-1649392870.4960034
89视频-1649392870.4960033
910音乐-1649392870.4960032
1011军事-1649392870.4960035
1112笑话-1649392870.49700024
1213笑话-1649392870.49700024
1314美食-1649392870.49700021
1415视频-1649392870.49700023
1516笑话-1649392870.49700024
1617美食-1649392870.49799681
1718军事-1649392870.49799685
1819音乐-1649392870.49799682
1920视频-1649392870.49799683
content.loc[3]
id                             4
title      视频-1649392870.4950054
cate_id                        3
Name: 3, dtype: object
# 更改content第四条的内容
content.loc[3,'cate_id'] = 6
content.head()
idtitlecate_id
01军事-1649392870.49400785
12美食-1649392870.49400781
23视频-1649392870.49500543
34视频-1649392870.49500546
45音乐-1649392870.49500542
pd.merge(cate,content,left_on='id',right_on='cate_id',suffixes=['_cate','_content'])
id_catenameid_contenttitlecate_id
01美食2美食-1649392870.49400781
11美食6美食-1649392870.49500541
21美食14美食-1649392870.49700021
31美食17美食-1649392870.49799681
42音乐5音乐-1649392870.49500542
52音乐10音乐-1649392870.4960032
62音乐19音乐-1649392870.49799682
73视频3视频-1649392870.49500543
83视频9视频-1649392870.4960033
93视频15视频-1649392870.49700023
103视频20视频-1649392870.49799683
114笑话8笑话-1649392870.4960034
124笑话12笑话-1649392870.49700024
134笑话13笑话-1649392870.49700024
144笑话16笑话-1649392870.49700024
155军事1军事-1649392870.49400785
165军事7军事-1649392870.49500545
175军事11军事-1649392870.4960035
185军事18军事-1649392870.49799685
pd.merge(cate,content,left_on='id',right_on='cate_id',suffixes=['_cate','_content'],how='outer')
id_catenameid_contenttitlecate_id
01.0美食2美食-1649392870.49400781
11.0美食6美食-1649392870.49500541
21.0美食14美食-1649392870.49700021
31.0美食17美食-1649392870.49799681
42.0音乐5音乐-1649392870.49500542
52.0音乐10音乐-1649392870.4960032
62.0音乐19音乐-1649392870.49799682
73.0视频3视频-1649392870.49500543
83.0视频9视频-1649392870.4960033
93.0视频15视频-1649392870.49700023
103.0视频20视频-1649392870.49799683
114.0笑话8笑话-1649392870.4960034
124.0笑话12笑话-1649392870.49700024
134.0笑话13笑话-1649392870.49700024
144.0笑话16笑话-1649392870.49700024
155.0军事1军事-1649392870.49400785
165.0军事7军事-1649392870.49500545
175.0军事11军事-1649392870.4960035
185.0军事18军事-1649392870.49799685
19NaNNaN4视频-1649392870.49500546
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: AMESim系统建模和仿真是一种先进的工程仿真软件,可帮助工程师进行系统级建模和仿真分析。从入门到精通AMESim系统建模和仿真,可以通过以下步骤进行学习: 1. 理解AMESim系统建模和仿真的基础概念:学习AMESim的基本原理和系统建模的核心概念,包括系统组件、信号流、物理量等基本概念。同时,熟悉AMESim的用户界面和操作方法。 2. 学习建模技术:学习如何使用AMESim建立系统模型。了解如何选择合适的组件,如何连接各个组件,并设置参数和初始条件。此外,还需学习如何为模型添加控制算法和仿真参数。 3. 仿真分析:学习如何运行模型进行仿真分析。了解如何设置仿真时间、采样频率等参数,并观察系统的动态行为。学习如何进行参数扫描、优化和灵敏度分析等仿真实验。 4. 高级建模技巧:进一步学习高级建模技巧,包括使用子模型、建立多领域耦合模型、模型在线优化等技术。 5. 集成和应用开发:学习如何将AMESim模型集成到整体系统中,如与其他建模软件或控制系统进行联合仿真。此外,还可学习如何开发应用程序,在AMESim的基础上开发自定义的模型和功能。 6. 实践经验积累:通过实践,不断积累经验,不断挑战更复杂的系统建模和仿真问题。可以尝试解决实际工程中的具体问题,或参与相关领域的研究项目,进一步提升自己的建模和仿真能力。 通过以上步骤,可以逐步掌握AMESim系统建模和仿真的核心技术,并能够独立开展系统建模和仿真工作。不断学习和实践,才能使自己从一个入门的使用者逐渐成为精通AMESim系统建模和仿真的专家。 ### 回答2: AMESim系统建模和仿真是一种用于工程设计和性能分析的先进工具。它可帮助工程师们快速而准确地创建复杂的动力系统模型,并通过仿真分析来评估设计方案的性能。 AMESim系统建模和仿真的入门级别涉及了软件的安装和基本操作。首先,用户需要安装AMESim软件,并了解其用户界面和基本功能。然后,用户可以开始创建第一个简单的模块,并通过连接这些模块来形成一个完整的系统模型。通过设置参数,并考虑模型中各组件的物理特性,用户可以使用AMESim来模拟系统的行为。 在掌握了基本操作之后,用户可以进一步学习高级建模技巧和功能。用户可以学习如何使用不同类型的模块和子模块来创建更复杂的模型,如液压、热力和电力系统。此外,用户还可以学习如何使用AMESim的分析工具来优化系统设计,并进行参数敏感性分析。 精通AMESim系统建模和仿真可能需要更深入的学习和实践。用户可以研究更高级的模块和子模块,以模拟更加复杂和真实的系统行为。此外,用户还可以学习如何使用外部数据和MATLAB/Simulink等软件进行数据交换和联合仿真。 总之,AMESim系统建模和仿真是一种强大的工程工具,可用于模拟和评估各种动力系统的性能。通过逐步学习和实践,用户可以从入门级别逐渐精通,并将其应用于工程实践中的各种问题和挑战。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今晚务必早点睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值