首页 > 解决方案 > 根据条件更改数据框行值的更快方法

问题描述

我有一个包含数百万条记录的大型数据框


数据集


我在代码中使用的列表是

image_jpg= ['image/jpeg','image/jpg','image/pjpeg']
image_png = ['image/png','image/x-png','application/png']
image_gif = ['image/gif']

我想创建一个名为name这样的新列,例如:

索引 0content_typeimage/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

输出

输出

问题是,这需要很长时间,因为数据框很大。

有没有更快的方法来完成这项任务?

标签: pythonpandasperformancedataframe

解决方案


我会将您的列表重组为字典并使用地图:

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

推荐阅读