python - 如何通过拆分现有的 pandas 列来创建新的列
问题描述
我有一个熊猫 DF,它看起来像:
Keyword | ranks | search_type | search_volume
kw1 |[{'rank': 1, 'url': example.com}]| 1 | 500
kw1 |[{'rank': 1, 'url': example.com}]| 2 | 500
kw2 |[{'rank': 2, 'url': example.com}]| 1 | 1500
kw2 |[{'rank': 2, 'url': example.com}]| 2 | 1500
kw3 |[{'rank': 1, 'url': example.com}]| 1 | 60
kw3 |[{'rank': 1, 'url': example.com}]| 2 | 60
我想要的是分成ranks
两列:ranks
其中包含排名,以及一个名为url
包含 url 的新列,因此生成的 df 将如下所示:
Keyword | ranks | url | search_type | search_volume
kw1 |[{'rank': 1 | 'url': example.com}]| 1 | 500
kw1 |[{'rank': 1 | 'url': example.com}]| 2 | 500
kw2 |[{'rank': 2 | 'url': example.com}]| 1 | 1500
kw2 |[{'rank': 2 | 'url': example.com}]| 2 | 1500
kw3 |[{'rank': 1 | 'url': example.com}]| 1 | 60
kw3 |[{'rank': 1 | 'url': example.com}]| 2 | 60
到目前为止,我已经尝试过:
df.ranks = df.ranks.str.split(',',1).tolist()
这会带回一个Nan
s 列表,我也尝试过df['ranks'].str.split(',', expand=True)
哪个不起作用。我试过了:
df = pd.DataFrame(df.ranks.str.split(' ',1).tolist(),columns = ['ranks','url'])
但我得到ValueError: Shape of passed values is (1, 400), indices imply (2, 400)
了回报。
编辑:df.ranks.dtype
退货dtype('0')
type(df.ranks)
退货pandas.core.series.Series
解决方案
我认为有list
s dicts
,所以建议使用列表推导和选择列表的第一个字典并按key
s 选择:
df['r'] = [x[0]['rank'] for x in df['ranks']]
df['u'] = [x[0]['url'] for x in df['ranks']]
print (df)
Keyword ranks search_type search_volume r \
0 kw1 [{'rank': 1, 'url': 'example.com'}] 1 500 1
1 kw1 [{'rank': 1, 'url': 'example.com'}] 2 500 1
2 kw2 [{'rank': 2, 'url': 'example.com'}] 1 1500 2
3 kw2 [{'rank': 2, 'url': 'example.com'}] 2 1500 2
4 kw3 [{'rank': 1, 'url': 'example.com'}] 1 60 1
5 kw3 [{'rank': 1, 'url': 'example.com'}] 2 60 1
u
0 example.com
1 example.com
2 example.com
3 example.com
4 example.com
5 example.com
或者:
df['r'] = [{'rank': x[0]['rank']} for x in df['ranks']]
df['u'] = [{'url': x[0]['url']} for x in df['ranks']]
print (df)
Keyword ranks search_type search_volume \
0 kw1 [{'rank': 1, 'url': 'example.com'}] 1 500
1 kw1 [{'rank': 1, 'url': 'example.com'}] 2 500
2 kw2 [{'rank': 2, 'url': 'example.com'}] 1 1500
3 kw2 [{'rank': 2, 'url': 'example.com'}] 2 1500
4 kw3 [{'rank': 1, 'url': 'example.com'}] 1 60
5 kw3 [{'rank': 1, 'url': 'example.com'}] 2 60
r u
0 {'rank': 1} {'url': 'example.com'}
1 {'rank': 1} {'url': 'example.com'}
2 {'rank': 2} {'url': 'example.com'}
3 {'rank': 2} {'url': 'example.com'}
4 {'rank': 1} {'url': 'example.com'}
5 {'rank': 1} {'url': 'example.com'}
推荐阅读
- c++ - 在 C++ 中创建阻塞队列向量时遇到问题
- sapui5 - 是否真的需要使用“attachInit”函数来监听全局初始化事件?
- reactjs - 反应:从图像中选择身体部位
- jestjs - 在全局命名空间中为开玩笑测试设置一个变量
- flutter - 如何用flare解决格式异常?
- python-3.x - 小数。无效操作:[
] - web3 - 无法在组件中使用语义 UI 反应添加背景图像
- r - 用手动图例绘制两个数据框
- amazon-web-services - 如何从 s3 存储桶下载 rpm 并使用 ansible plabook 安装?
- python - 循环遍历包含 csv 文件的目录执行操作