python - 根据条件更改数据框行值的更快方法
问题描述
我有一个包含数百万条记录的大型数据框,
我在代码中使用的列表是,
image_jpg= ['image/jpeg','image/jpg','image/pjpeg']
image_png = ['image/png','image/x-png','application/png']
image_gif = ['image/gif']
我想创建一个名为name
这样的新列,例如:
索引 0的content_type
值image/jpeg
在列表中 image_jpg
,因此,name
列获取5efc61356f85e500694bcbbbbb3ee4c2.jpg
( sys_id
column + .jpg
)的值
现在我正在通过以下方式实现这一目标:
file_name = []
for index, row in df.iterrows():
if row['content_type'] in image_jpg:
file_name.append(str(row['sys_id'])+'.jpg')
elif row['content_type'] in image_png:
file_name.append(str(row['sys_id'])+'.png')
elif row['content_type'] in image_png:
file_name.append(str(row['sys_id'])+'.gif')
else:
file_name.append(str(row['sys_id']))
df['name'] = file_name
输出:
问题是,这需要很长时间,因为数据框很大。
有没有更快的方法来完成这项任务?
解决方案
我会将您的列表重组为字典并使用地图:
df['name'] = df['id'] + df['content_type'].map(d).fillna('')
感谢@jezrael,我们还应该添加一个 fillna('') 来处理错误。
这意味着您应该用以下内容替换您的列表:
d = {
'application/png': '.png',
'image/gif': '.gif',
'image/jpeg': '.jpg',
'image/jpg': '.jpg',
'image/pjpeg': '.jpg',
'image/png': '.png',
'image/x-png': '.png',
}
完整示例:
import pandas as pd
d = {
'application/png': '.png',
'image/gif': '.gif',
'image/jpeg': '.jpg',
'image/jpg': '.jpg',
'image/pjpeg': '.jpg',
'image/png': '.png',
'image/x-png': '.png',
}
# some random data
df = pd.DataFrame({
'id': ['1232131iujajga','21hi3hk123h21', '1231231231'],
'content_type': ['image/gif', 'image/jpg', '']
})
df['name'] = df['id'] + df['content_type'].map(d).fillna('')
print(df)
回报:
content_type id name
0 image/gif 1232131iujajga 1232131iujajga.gif
1 image/jpg 21hi3hk123h21 21hi3hk123h21.jpg
2 1231231231 1231231231
推荐阅读
- c# - ASP.NET 自定义 WebHook 实现
- amazon-web-services - env.yml 与 .config 之间的 AWS Elastic Beanstalk 区别
- java - Java Spring Application,经过HTTP请求方法
- typescript - 使用bind时如何对this的typescript类型说?
- android - 如何在 Android Studio 中禁用 lambda 功能?
- python - 简单的加法问题在python中不起作用
- python - Matplotlib:如何只显示一个图形而不关闭其他图形?
- javascript - 从我的桌面复制 S3 存储桶文件后未显示
- reactjs - 更改第 3 方组件的背景颜色而不更改其代码
- ios - 如果我使用工具栏,UISplitViewController 的颜色显示不正确