如何处理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将恢复正确的列对应关系:
| id | date | account | site | balance |
|---|---|---|---|---|
| 1 | 1970-01-01 | JE | 1189 | 40 |
| 2 | 1970-01-01 | PR | 1120 | 60 |
| 3 | 1970-01-01 | JE | 1130 | 90 |
| 4 | 2023-12-31 | JE | 1131 | 60 |
(注:前3行的date值为数字45281,转成datetime后是1970-01-01,若原始数据中是其他日期格式,可调整pd.to_datetime的参数)
内容的提问来源于stack exchange,提问作者Learner27
相关产品推荐
相关产品推荐

