Python使用explode拆分多列|分隔字段含NaN时元素计数不匹配问题
错误原因
多列同时执行explode操作时,要求同一行内所有待展开列的列表长度完全一致。你之前将NaN值替换为空列表,空列表长度为0,与同一行其他列拆分后的列表长度不匹配,因此触发columns must have matching element counts报错。
解决代码
import pandas as pd import numpy as np # 构造测试数据,可替换为你自己的数据集 df_test = pd.DataFrame({ 'A': ['1 | 2 | 3', '4 | 5', np.nan], 'B': ['app | ban | cor', 'dep | exp', 'for | gep'], 'C': [np.nan, np.nan, np.nan] }) cols = ['A','B','C'] # 第一步:拆分所有带分隔符的列 for col in cols: # \s*\|\s* 自动去除分隔符前后的多余空格,不需要可替换为'|' df_test[col] = df_test[col].str.split('\s*\|\s*') # 第二步:计算每行的目标展开长度(根据规则同一行非空列拆分后长度一致,取最大值即可) df_test['row_len'] = df_test.apply(lambda x: max([len(v) for v in x if isinstance(v, list)]), axis=1) # 第三步:将NaN列填充为和当前行长度一致的全NaN列表 for col in cols: df_test[col] = df_test.apply(lambda x: [np.nan]*x['row_len'] if not isinstance(x[col], list) else x[col], axis=1) # 第四步:展开多列,删除辅助列 df_long = df_test.explode(cols).drop('row_len', axis=1).reset_index(drop=True) print(df_long)
输出结果
A B C 0 1 app NaN 1 2 ban NaN 2 3 cor NaN 3 4 dep NaN 4 5 exp NaN 5 NaN for NaN 6 NaN gep NaN
内容的提问来源于stack exchange,提问作者JSC
相关产品推荐
相关产品推荐

