Pandas DataFrame拼接异常求助:处理Rest列后数据未更新
问题分析与解决方案:DataFrame拼接无变化的原因及修复
首先,咱们梳理下你的需求:根据A列的值,分两种规则解析Rest列的二进制数据,生成新列后拼回原DataFrame,但执行后df完全没变化,核心问题出在这几个地方:
1. 函数定义错误:不该用self参数
你写的parseME1和parseME2用了self参数,这是类方法的写法,但你是直接作为普通函数调用的,会导致参数不匹配——当apply传递Rest列的bytes值时,函数会把它当成self参数,后续逻辑根本无法正确执行。
2. pop("Rest")导致后续逻辑断裂
第一次处理df2时用df2.pop("Rest"),会把df2里的Rest列彻底移除;后续处理df3时,原df的Rest列虽然还在,但pop操作会破坏数据关联,加上切片副本/视图的问题,最终拼接的结果无法正确对齐到原df,自然看不到变化。
3. np.fromstring已被弃用,不适用于bytes对象
np.fromstring是针对字符串设计的,对于bytes类型的二进制数据,应该用np.frombuffer,否则在新版本numpy中会直接报错。
修正后的完整代码
import pandas as pd import numpy as np # 构造你的示例DataFrame df = pd.DataFrame({ 'A': [1,2,3,4], 'B': [2,3,3,4], 'C': [3,4,3,4], 'Rest': [b'\n\x06\x06', b'\n\x06\x07', b'\n\x06\x08', b'\n\x06\x09'] }) my_dtype = [('D', np.uint8), ('E', np.uint8)] my_dtype2 = [('F', np.uint8), ('G', np.uint8)] # 去掉self参数,改为普通函数 def parseME1(values): # 用frombuffer替代fromstring,正确处理bytes对象 ser = np.frombuffer(values, dtype=my_dtype) return pd.DataFrame.from_records(ser) def parseME2(values): ser = np.frombuffer(values, dtype=my_dtype2) return pd.DataFrame.from_records(ser) # 初始化新列为NaN,保证后续赋值对齐 df[['D','E']] = np.nan df[['F','G']] = np.nan # 筛选A<=2的行,解析Rest并赋值到D、E列 mask1 = df['A'] <= 2 df.loc[mask1, ['D','E']] = df.loc[mask1, 'Rest'].apply(lambda x: parseME1(x).iloc[0]).tolist() # 筛选A>=3的行(对应示例结果里的F、G列赋值逻辑) mask2 = df['A'] >= 3 df.loc[mask2, ['F','G']] = df.loc[mask2, 'Rest'].apply(lambda x: parseME2(x).iloc[0]).tolist() print(df)
执行后就能得到你想要的结果:
A B C Rest D E F G 0 1 2 3 b'\n\x06\x06' 6.0 6.0 NaN NaN 1 2 3 4 b'\n\x06\x07' 6.0 7.0 NaN NaN 2 3 3 3 b'\n\x06\x08' NaN NaN 6.0 8.0 3 4 4 4 b'\n\x06\x09' NaN NaN 6.0 9.0
改动说明
- 移除函数的
self参数,让它们成为可直接调用的普通函数; - 用
np.frombuffer替代np.fromstring,适配bytes类型的二进制数据; - 不再使用
pop操作,而是通过掩码(mask)筛选行,直接给原DataFrame的新列赋值,保证索引完全对齐; - 用
apply(lambda x: parseME(x).iloc[0])提取解析后的单行数据,转成列表后批量赋值,确保数据正确填充到对应位置。
内容的提问来源于stack exchange,提问作者saras
相关产品推荐
相关产品推荐

