选择 Pandas 数据框中的 1.6M 行

5

我有一个包含约230万行的CSV文件。我希望保存子集(约160万行),这些行在数据框中的两列中具有非NAN值。我希望继续使用pandas来完成这个任务。目前,我的代码如下:

import pandas as pd
catalog = pd.read_csv('catalog.txt')
slim_list = []
for i in range(len(catalog)):
    if (pd.isna(catalog['z'][i]) == False and pd.isna(catalog['B'][i]) == False):
        slim_list.append(i)

该代码块存储目录中具有非NaN值的行。然后,我使用这些行作为条目创建一个新的目录。

slim_catalog = pd.DataFrame(columns = catalog.columns)
for j in range(len(slim_list)):
    data = (catalog.iloc[j]).to_dict()
    slim_catalog = slim_catalog.append(data, ignore_index = True)
pd.to_csv('slim_catalog.csv')

原则上,这应该可以工作。通过将每一行读入到字典中,可以加快速度。然而,对于所有的2.3M行记录来说,执行时间太长了。有什么更好的方法来解决这个问题?


1
你尝试过使用 dfx = df[df['z'].notnull()] 来查看它的结果吗? - Joe Ferndz
2
我认为你可以过滤并保存你的数据集catalog[(catalog['z'].notna()) & (catalog['B'].notna())].to_csv('slim_catalog.csv') - Maximilian Peters
1个回答

1
这是pandas中完全错误的做法。
首先,永远不要迭代某个范围,例如for i in range(len(catalog)):然后逐个索引行:catalog['z'][i],这是非常低效的。
其次,不要在循环中使用pd.DataFrame.append创建pandas.DataFrame,这是线性操作,所以整个过程将是二次时间复杂度。
但是你不应该从一开始就进行循环。你只需要像这样:
catalog[catalog.loc[:, ['z', 'B']].notna().all(axis=1)].to_csv('slim_catalog.csv')

或者分开以便更易读取:

不要解释。

not_nan_zB = catalog.loc[:, ['z', 'B']].notna().all(axis=1)
catalog[not_nan_zB].to_csv('slim_catalog.csv')

这就是为什么物理学家需要编码许可证的原因 :) - 如果目录成功加载(只有50%的几率),我会尝试一下并在它有效时接受它。 - user3517167
1
@user3517167 哈哈,事实上我与几位物理学家(按照他们的专业)一起工作。现在他们都是优秀的编程人员,但是确实有很多人被扔到了Pandas等深水区,需要学习一些东西。 - juanpa.arrivillaga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接