如何正确展开含数值的Pandas DataFrame?
如何正确展开Pandas DataFrame中的序列式字符串列?
原始数据
import pandas as pd id = [100, 101] nums = ['9, 5', '11, 12, 13'] out = [1, 0] df = pd.DataFrame({'id': id, 'nums':nums, 'y':out})
错误尝试及结果
通过固定步长截取字符串的方式生成序列,因无法适配多位数数字导致结果残缺:
# 错误的展开代码 df['nums'] = [''.join(i.split()) for i in df['nums']] df['nums'] = df['nums'].apply(lambda s: [s[:i] for i in range(1, len(s)+1, 2)]) df = df.explode('nums') df.reset_index(drop=True)
错误输出:
id nums y 0 100 9 1 0 100 9,5 1 1 101 1 0 1 101 11, 0 1 101 11,12 0 1 101 11,12,1 0
期望结果
id nums y 0 100 9 1 0 100 9,5 1 1 101 11 0 1 101 11,12 0 1 101 11,12,13 0
正确解决方法
核心思路是先拆分字符串为独立元素,再逐步拼接生成完整序列,避免字符串截取的适配问题:
import pandas as pd id = [100, 101] nums = ['9, 5', '11, 12, 13'] out = [1, 0] df = pd.DataFrame({'id': id, 'nums':nums, 'y':out}) # 1. 将nums拆分为去除空格的元素列表 df['nums_list'] = df['nums'].apply(lambda x: [num.strip() for num in x.split(',')]) # 2. 生成逐步拼接的序列字符串 df['nums'] = df['nums_list'].apply(lambda lst: [', '.join(lst[:i+1]) for i in range(len(lst))]) # 3. 展开列并清理临时数据 df = df.explode('nums').drop('nums_list', axis=1).reset_index(drop=True) print(df)
运行后输出与期望结果一致:
id nums y 0 100 9 1 1 100 9,5 1 2 101 11 0 3 101 11,12 0 4 101 11,12,13 0
内容的提问来源于stack exchange,提问作者DaCard
相关产品推荐
相关产品推荐

