Pandas使用explode()报非唯一多索引ValueError错误如何解决?
Pandas多列按逗号拆分关联原表报错解决方案
报错原因
你当前按列单独执行split+explode的写法,会导致两列拆分后生成的行数不匹配,Pandas无法基于重复的多索引对齐数据,因此触发ValueError: cannot handle a non-unique multi-index!报错。
推荐解决方案(Pandas ≥1.3.0)
直接对多列同时执行拆分和explode操作,保证同一行拆分后的元素按位置一一对应,自动关联原表其他字段:
import pandas as pd data = {'fruit_tag': {0: 'apple, organge', 1: 'watermelon', 2: 'banana', 3: 'banana', 4: 'apple, banana'}, 'location': {0: 'Hong Kong , London', 1: 'New York, Tokyo', 2: 'Singapore', 3: 'Singapore, Hong Kong', 4: 'Tokyo'}, 'rating': {0: 'bad', 1: 'good', 2: 'good', 3: 'bad', 4: 'good'}, 'measure_score': {0: 0.9529434442520142, 1: 0.952498733997345, 2: 0.9080725312232971, 3: 0.8847543001174927, 4: 0.8679852485656738}} dt = pd.DataFrame.from_dict(data) # 先拆分两列并去除元素前后多余空格 dt[['fruit_tag', 'location']] = dt[['fruit_tag', 'location']].apply(lambda x: x.str.split(',').str.strip()) # 多列同时explode,自动对齐关联原表字段 res = dt.explode(['fruit_tag', 'location'])
低版本Pandas兼容方案
如果你的Pandas版本低于1.3.0,不支持多列同时explode,可以使用按行处理的写法:
res = dt.set_index(['rating', 'measure_score'])\ .apply(lambda x: x.str.split(',').str.strip(), axis=1)\ .explode(['fruit_tag', 'location'])\ .reset_index()
注意:如果同一行两个待拆分字段分割后的元素数量不一致,短字段会自动补NaN对齐
内容的提问来源于stack exchange,提问作者codedancer
相关产品推荐
相关产品推荐

