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

如何处理Pandas DataFrame中错位拼接行:拆分并移位值

解决Pandas DataFrame中换行符拼接值导致的列移位问题

问题分析

你的数据里部分行存在多列值被\n拼接在某一列,同时后续列整体左移的情况(比如第4行:date/account/site的值被拼在date列,balance值移到了account列)。单纯用str.split('\n', expand=True)只是拆分了列,但没把拆分后的值映射到对应列,也没修正移位的数值,所以无效。

完整解决方案

以下是可直接运行的代码,分步骤修正数据:

import pandas as pd

# 构造原始数据
lst = [[1, 45281, 'JE', 1189, 40],
       [2, 45281, 'PR', 1120, 60],
       [3, 45281, 'JE', 1130, 90],
       [4, '12/31/2023\nJE\n1131', '60']]
columns = ['id', 'date', 'account', 'site', 'balance']
new = pd.DataFrame(data=lst, columns=columns)

# 1. 标记需要修正的行(date列包含换行符)
mask = new['date'].str.contains('\n', na=False)

# 2. 保存移位到account列的balance值
balance_values = new.loc[mask, 'account']

# 3. 拆分拼接的date列,得到正确的date/account/site值
split_df = new.loc[mask, 'date'].str.split('\n', expand=True)
split_df.columns = ['corrected_date', 'corrected_account', 'corrected_site']

# 4. 将拆分后的值替换到对应列,并恢复balance值
new.loc[mask, 'date'] = split_df['corrected_date']
new.loc[mask, 'account'] = split_df['corrected_account']
new.loc[mask, 'site'] = split_df['corrected_site']
new.loc[mask, 'balance'] = balance_values

# 可选:将数值列转换为对应类型
new['site'] = pd.to_numeric(new['site'])
new['balance'] = pd.to_numeric(new['balance'])
new['date'] = pd.to_datetime(new['date'])

最终效果

修正后的DataFrame将恢复正确的列对应关系:

iddateaccountsitebalance
11970-01-01JE118940
21970-01-01PR112060
31970-01-01JE113090
42023-12-31JE113160

(注:前3行的date值为数字45281,转成datetime后是1970-01-01,若原始数据中是其他日期格式,可调整pd.to_datetime的参数)

内容的提问来源于stack exchange,提问作者Learner27

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:42:42