如何拆分Pandas DataFrame的ranks列以生成新url列?
解决Pandas DataFrame中嵌套列表字典列的拆分问题
你之前尝试用字符串拆分处理ranks列没成功,核心原因是这个列里存的不是字符串,而是包含单个字典的Python列表对象(dtype('O')也能佐证这一点),所以字符串拆分的思路完全不对。咱们换个方式直接处理嵌套的字典结构就行:
具体实现步骤与代码
- 提取列表中的字典:每个
ranks元素都是长度为1的列表,用.str[0]就能直接取出里面的字典 - 把字典转成独立列:用
apply(pd.Series)可以把字典的键自动转为列名,对应的值填充到各行 - 合并回原DataFrame,再调整列名和顺序
完整代码如下:
import pandas as pd # 基于你的原始DataFrame操作 # 第一步:提取列表里的字典并转为DataFrame rank_url_df = df['ranks'].str[0].apply(pd.Series) # 第二步:合并到原DataFrame,并重命名列匹配需求 df = pd.concat([df, rank_url_df], axis=1) # 替换原ranks列,或者直接覆盖(这里用rename后删除原列更清晰) df = df.rename(columns={'rank': 'ranks'}) df = df.drop(columns=['ranks']) # 删除原来存列表的ranks列 # 第三步:调整列顺序到你想要的格式 df = df[['Keyword', 'ranks', 'url', 'search_type', 'search_volume']]
为什么你之前的方法无效?
- 用
str.split()是把列内容当成字符串处理,但ranks里是列表对象,自然会返回NaN - 尝试
pd.DataFrame(df.ranks.str.split(' ',1).tolist())时,拆分后的结果形状和你预设的列数不匹配,所以抛出ValueError
最终效果
运行代码后,你的DataFrame会完全符合预期:
| Keyword | ranks | url | search_type | search_volume |
|---|---|---|---|---|
| kw1 | 1 | example.com | 1 | 500 |
| kw1 | 1 | example.com | 2 | 500 |
| kw2 | 2 | example.com | 1 | 1500 |
| kw2 | 2 | example.com | 2 | 1500 |
| kw3 | 1 | example.com | 1 | 60 |
| kw3 | 1 | example.com | 2 | 60 |
内容的提问来源于stack exchange,提问作者jceg316
相关产品推荐
相关产品推荐

