使用Pandas将指定数据移至新列并保留原有位置
高效解决方案
你的核心问题是原代码通过筛选子集再合并的方式无法保证索引对齐,导致Async Serial数据错位;而循环处理在大数据量下效率极低。以下是基于Pandas矢量化操作的高效方案,处理66万行数据仅需几秒:
方案1:新增列保留对应行的Async Serial数据
如果需求是保留原数据所有行,同时在新列中标记出name包含"Async Serial"的行的对应内容(比如value列或整个行信息),直接用布尔索引+矢量化赋值:
import pandas as pd import numpy as np # 假设原数据为data,新增一列存储Async Serial对应的value(可替换为你需要的列) data['async_serial_col'] = np.where( data['name'].str.contains('Async Serial'), data['value'], # 这里替换为你需要提取的字段,比如data['name']或整行data np.nan )
方案2:将Async Serial数据匹配到对应mid recieve行
如果你的业务逻辑是每个mid recieve行对应后续的Async Serial行,可以用移位操作实现行对齐:
# 标记两类行的布尔掩码 mask_async = data['name'].str.contains('Async Serial') mask_mid = data['name'].str.contains('mid recieve') # 将Async Serial的value移到前一行(对应mid recieve行) data['matched_async'] = data['value'].where(mask_async).shift(-1) # 若只需要保留mid recieve行并匹配对应Async数据,可过滤: result = data[mask_mid].dropna(subset=['matched_async'])
为什么这个方案高效?
- 避免了循环遍历,Pandas的矢量化操作基于底层C实现,处理百万级数据速度远超Python循环;
- 直接在原数据上操作,无需额外筛选子集再合并,既避免了索引错位问题,又完整保留原有行的位置。
内容的提问来源于stack exchange,提问作者Achen
相关产品推荐
相关产品推荐

