【问题标题】:Pandas - Loop through over 1 million cellsPandas - 循环超过 100 万个细胞
【发布时间】:2023-03-09 18:55:01
【问题描述】:

我有一个包含超过 200 000 个代码的导出文件,我试图仅过滤掉这些代码。由于每个代码都有多行不相关的信息,文件本身就超过了 100 万行。

我写了一个脚本来读取文件,根据前缀找到代码,然后写入另一个.csv文件:

import pandas as pd

df = pd.read_csv('export_file.csv')

output = []

for index, row in df.iterrows(): 
  if ('PREFIX-01' in str(row['code'])):
    code = str(row['code'])
    output.append(code)

with open('output.csv','w') as file:
    for line in output:
        file.write(line)
        file.write('\n')

该脚本适用于少量代码(大约 50k),但循环所有这些行需要很长时间。 Python 和 Pandas 对我来说相对较新,所以我想知道是否有办法让脚本更高效?

我听说grep 在这里有用,但目标是最终将其写入 Web 服务,因此我宁愿不通过命令行来执行此操作。

【问题讨论】:

  • 你能试试df2 = df[df['code'].str.contains('PREFIX-01')]然后把那个a写到一个新的csv中。
  • @Datanovice 我得到了ValueError: Cannot mask with non-boolean array containing NA / NaN values。我相信这是由于 code 列有多个空行/值,因为其他行中的附加信息。
  • 我添加了标志str.contains('PREFIX-01', na=False),现在它可以工作了!但是我只想保留code 列,是否可以删除其他所有内容?

标签: python pandas numpy


【解决方案1】:

感谢@Datanovice,我让程序运行得更好了。将执行时间从约 10 分钟缩短到 5 秒。

import pandas as pd
import time

df = pd.read_csv('exported_file.csv')


df2 = df[df['code'].str.contains('PREFIX-01', na=False)]
output = df2['code'] # Feels redundant for this step (only extract the code column) 
                     # Tips are welcome how to bake it into the line above 

output.to_csv('output.csv', sep=',', encoding='utf-8', index=False)

【讨论】:

  • 使用output = df.loc[df['code'].str.contains('PREFIX-01', na=False), 'code']
猜你喜欢
  • 2017-12-01
  • 1970-01-01
  • 2016-01-24
  • 2020-03-24
  • 2015-03-20
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2022-07-01
相关资源
最近更新 更多