gpt4 book ai didi

python - 根据条件更改数据框行值的更快方法

转载 作者:行者123 更新时间:2023-11-28 17:03:26 25 4
gpt4 key购买 nike

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


data set


我在我的代码中使用的列表是

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

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

索引 0content_typeimage/jpeglist image_jpg,因此,5efc61356f85e500694bcbbbbb3ee4c2.jpgname获取值 ( 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

输出:

output

问题是,它需要相当长的时间,因为数据框非常大。

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

最佳答案

使用字典和按列操作:

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

d_rev = {w: k for k, v in d.items() for w in v}

for k, v in d_rev.items():
mask = df['content_type'].str.contains(v, regex=False)
df.loc[mask, 'name'] = df.loc[mask, 'sys_id'] + '.' + k.split('/')[-1]

或者,如果需要相等:

for k, v in d_rev.items():
mask = df['content_type'].eq(v)
df.loc[mask, 'name'] = df.loc[mask, 'sys_id'] + '.' + k.split('/')[-1]

对于相等情况,@AntonvBR's pd.Series.map solution更好。

解释

d_rev 将每个列表值映射到一个键:-

print(d_rev)

{'application/png': 'image_png', 'image/gif': 'image_gif',
'image/jpeg': 'image_jpg', 'image/jpg': 'image_jpg',
'image/pjpeg': 'image_jpg', 'image/png': 'image_png',
'image/x-png': 'image_png'}

鉴于类别很少,行数很多,迭代字典和使用优化的列操作更有效。请记住,iterrows 只是一个缓慢的逐行循环,它对于大量的行总是效率低下。

关于python - 根据条件更改数据框行值的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52774467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com