python编程tips-01 数据拼接

本文详细介绍了Python中数据拼接的方法,包括List的append和extend,DataFrame的非条件拼接(append、concat)和条件拼接(merge、join),以及Array的numpy.append、numpy.concatenate、numpy.stack、numpy.vstack、numpy.hstack、numpy.dstack、numpy.c_和numpy.r_的使用。文章旨在帮助读者清晰理解各种数据拼接方式及其适用场景。
部署运行你感兴趣的模型镜像

使用python进行数据处理,常免不了做数据拼接。可是因为常用的数据容器类型不少,有List,array,DataFrame等,时不时搞混(根本原因是以前偷懒一直没用心去记-_-’)。终于痛定思痛,决定好好整理记录下来,并养成好习惯。。。

以下按照不同数据容器类型,整理出了可用的数据拼接方法。

(一) List

python为列表提供的拼接方法,首先是append和extend。其中append是把参数整个作为元素回到原列表的末尾作为一个元素,而extend则是把参数列表的所有元素作为原列表的新元素追加到末尾。另外有一点需注意的是,append和extend调用的结果是直接修改原列表,无返回值。 例子如下:
List的append,extend方法演示
除此以外,python中的+和+=操作符,作用在列表上,也具有拼接的功能。其中,+=的实现的功能和extend一样,而+则和extend略有不同:其返回的是一个新列表,而非原列表。例子如下:
在这里插入图片描述

(二) DataFrame

DataFrame提供的拼接功能要更为丰富一些。大抵可以概括为非条件拼接和条件拼接两种(非条件拼接条件拼接是我为了便于理解记忆自己杜纂的,因此莫问出处)。

1. 非条件拼接

非条件拼接包括append和concat。

(1) append

append实现的功能和List的+功能类似,即执行结果是返回一个新的DataFrame,且不改变原DataFrame。
在这里插入图片描述
此外,DataFrame合并涉及到index的处理:置ignore_index=True(默认False)可以无视原index并在合并后新建index;相反的,置verify_integrity=True(默认False)则可以使得合并遇到重复index时报错。

(2) pandas.concat

concat比append灵活,因为concat既可在行方向扩展,也可在列方向扩展。控制扩展方向的参数为axis(默认为0)。
此外,对于拼接的DataFrame行列没能对齐的情况,concat通过参数join提供了两种拼接方法outer(默认)和 inner。前者将使用NaN填充空缺的数据域,后者则将所有有空缺的数据域(行和列)删除。
在这里插入图片描述
concat也有ignore_index和verify_integrity参数。

2. 条件拼接

之所以叫它条件拼接,是因为它需要按某个指定的条件进行拼接,实现的效果很象SQL的表关联查询。
条件拼接有merge和join,前者是pandas的方法,后者是DataFrame的方法。

(1) pandas.merge

需要指定关联的列,使用on指定。关联列不只一个列的,使用列表方式on=[colName1, colName2,…]。关联的方式,和SQL差不多,默认为inner,可选left,right,outer。
在这里插入图片描述
方法merge参数较多,更详细的用,可到pandas官网查看:http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html?highlight=merge#pandas.DataFrame.merge

(2) join

join也需要指定关联的列。需要特别注意的一点是,其关联的方式默认为left而不是inner,这一点有别于merge,需要特别注意。
在这里插入图片描述
方法join参数较多,更详细的用法,可到pandas官网查看:http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.join.html#pandas.DataFrame.join

(三) array

numpy的数组合并方法很多(其实感觉有点多过头了……)。

1. numpy.append

append方法的参数比较少,关于参数,有两点需要注意:
(1)参数axis的值和选取,如何与对数组进行拼接的维度进行对应;
(2)确保进行拼接的两个数组,除了进行拼接的维度以外,其他维的长度都是相同的。
在这里插入图片描述
当数据量很大时,使用append方式会很慢,因为每次都会把之前的数组复制给一个新的数组。
另外,append返回的数组,其维数将和原数组一致。无法通过append方法拼接出更高维的数组。

2. numpy.concatenate

concatenate的使用方法及调用结果和append差不多,唯一不同的,是concatenate的axis默认值为0.
在这里插入图片描述
concatenate的效率高于append,这种优势在大数据量情况下更加明显。

3. numpy.stack

stack用于矩阵堆叠,在参与堆叠的矩阵多于一个时,堆叠结果将必然增加一个维度。参数axis用于控制在哪两个维度之间增加新维度。
在这里插入图片描述

4. numpy.vstack & numpy.hstack & dstack

vstack是沿着第一个维度进行拼接,相当于concatenate取axis=0;hstack是沿着第二个维度进行拼接,相当于concatenate取axis=1;dstack是沿着第三个维度进行拼接,相当于concatenate取axis=2.
在这里插入图片描述

5. numpy.c_ & numpy.r_

r_效果同vstack,c_效果则和hstack相同,但调用方法略有不同。r_和c_并不是函数的方法,因此不使用括号,而是使用方括号。
另外看到网上有人有人说r_和c_的性能和vstack等并不相同,但没找到详细说明,因此先Mark着,以后再补充。
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

帮我分析一下这个代码的运行模式以及用到的Python知识class ElderDietModel: def __init__(self): self.knowledge_graph = self.load_knowledge_graph() self.health_rules = { '高血压': {'max_sodium': 1500, 'avoid': ['腌菜','腊肉']}, '糖尿病': {'max_gi': 55, 'avoid': ['粘豆包','拔丝地瓜']}, '骨质疏松': {'min_calcium': 1000, 'recommend': ['冻豆腐','奶皮子']}, '缺牙': {'hardness': '软烂', 'avoid': ['冻梨','锅巴']} } def recommend(self, user_profile): menu = self._generate_base_menu(user_profile) adjusted_menu = self._apply_health_rules(menu, user_profile) return self._add_cultural_adaptation(adjusted_menu, user_profile) def _generate_base_menu(self, user): base_dishes = [] if "黑龙江" in user["location"]: base_dishes = ["土豆炖大鹅", "地三鲜", "苏泊汤"] elif "吉林" in user["location"]: base_dishes = ["清蒸白鱼", "酱骨架", "冷面"] for fav in user["traditional_favs"]: if fav in self.knowledge_graph.get("改良食谱库", []): base_dishes.append(fav + "(健康版)") return base_dishes def _apply_health_rules(self, menu, user): adjusted_menu = [] for dish in menu: current_dish = dish nutrition = self.knowledge_graph["菜品营养表"].get(dish, {}) if "高血压" in user["conditions"]: if nutrition.get("钠(mg)", 0) > self.health_rules["高血压"]["max_sodium"]: current_dish = self._find_low_sodium_alternative(current_dish) if "缺牙" in user["conditions"]: if self.knowledge_graph["质地分级"].get(current_dish, "") != "软烂": current_dish += "(慢炖版)" adjusted_menu.append(current_dish) return adjusted_menu def _add_cultural_adaptation(self, menu, user): cultural_adjustments = { "酸菜白肉": { "改良方案": ["酸菜(乳酸菌发酵减钠30%)", "五花肉→梅花肉(脂肪降40%)"], "营养变化": {"热量": "-35%", "钠": "-42%"} }, "锅包肉": { "改良方案": ["糖醋汁→赤藓糖醇", "裹糊用全麦粉"], "GI值变化": "68→52" } } final_menu = [] for dish in menu: if dish in cultural_adjustments: adjusted = f"{dish}☆改良版({cultural_adjustments[dish]['营养变化']})" final_menu.append(adjusted) else: final_menu.append(dish) return { "推荐菜单": final_menu, "健康提示": self._generate_health_tips(menu, user), "文化适配": self._generate_cultural_notes(menu, user) } # 以下为需补充的辅助方法(示意) def load_knowledge_graph(self): """模拟加载知识图谱数据""" return { "改良食谱库": ["酸菜白肉", "锅包肉"], "菜品营养表": { "酸菜白肉": {"钠(mg)": 1200}, "地三鲜": {"钠(mg)": 800} }, "质地分级": { "锅包肉": "酥脆", "酸菜白肉": "软烂" } } def _find_low_sodium_alternative(self, dish): """模拟查找低钠替代品""" return dish + "(低钠版)" def _generate_health_tips(self, menu, user): """生成健康提示""" tips = {} if "高血压" in user["conditions"]: total_sodium = sum(self.knowledge_graph["菜品营养表"][d].get("钠(mg)",0) for d in menu) tips["钠控制"] = f"今日预估摄入钠{total_sodium}mg(<1500mg标准)" return tips def _generate_cultural_notes(self, menu, user): """生成文化适配说明""" return { "传统保留项": "保留酸菜风味但钠含量降低", "替代方案": "提供冻梨果泥替代传统冻梨" }
最新发布
03-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值