如何高效实现Pandas DataFrame列内字典的取整与排序?
高效处理Pandas DataFrame中嵌套集合的数值格式化与排序
针对你的需求,我们可以用Pandas的apply方法结合自定义函数来高效处理整个score列,完全不需要手动写for循环,代码简洁且性能更优。
完整解决方案代码
import pandas as pd # 初始化原始DataFrame languages = ['en','cs','es'] counties = ['us','ch','sp'] count = [32, 432,43] a = {('p', 0.25937605905953339), ('q', 0.2001602214732502)} b = {('r', 0.5937605905953339), ('4', 0.12001602214732502)} c = {('l', 0.35337605905953339), ('r', 0.42001602214732502)} score =[a, b, c] df1 = pd.DataFrame({'language': languages,'county': counties, 'count' : count, 'score': score}) # 定义处理单个score元素的函数 def process_score(score_set): # 1. 遍历集合,将分数保留四位小数 formatted_items = [(name, round(score, 4)) for name, score in score_set] # 2. 按分数升序排序 sorted_items = sorted(formatted_items, key=lambda x: x[1]) # 3. 返回集合(如果需要保持顺序,改为返回sorted_items列表即可) return set(sorted_items) # 批量应用函数到整个score列 df1['score'] = df1['score'].apply(process_score) # 查看结果 print(df1)
关键细节说明
为什么用
apply而不是for循环?
Pandas的apply方法内部做了性能优化,比手动遍历DataFrame行的for循环效率更高,尤其是数据量较大时,性能差距会更明显。关于集合的无序性
注意Python的集合是无序的,所以即使我们排序后转成集合,后续显示时顺序可能会有变化。如果需要严格保持排序后的顺序,建议把函数的返回值改成列表:return sorted_items此时
score列会变成有序列表,显示结果会完全匹配你期望的排序顺序。代码逻辑拆解
- 用列表推导式快速遍历集合元素,将分数四舍五入到四位小数;
sorted函数通过key=lambda x: x[1]指定按元组的第二个元素(分数)进行升序排序;apply自动遍历score列的每个元素,应用处理函数并更新列值。
内容的提问来源于stack exchange,提问作者Vineet
相关产品推荐
相关产品推荐

