You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 21:52:47