【问题标题】:Selecting 1.6M rows of a pandas dataframe [duplicate]选择 160 万行的熊猫数据框 [重复]
【发布时间】:2021-03-06 15:48:56
【问题描述】:

我有一个大约 230 万行的 csv 文件。我想保存数据框内两列中具有非 nan 值的行的子集(~1.6M)。我想继续使用熊猫来做到这一点。现在,我的代码如下所示:

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 值的 catalog 的行。然后我用这些行作为条目制作一个新目录

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')

原则上,这应该可行。通过将每一行读入一个字典来加快速度。但是,执行所有 230 万行需要非常非常长的时间。有什么更好的方法来解决这个问题?

【问题讨论】:

  • 您尝试dfx = df[df['z'].notnull()] 看看结果如何?
  • 我认为您可以过滤并保存您的数据集catalog[(catalog['z'].notna()) & (catalog['B'].notna())].to_csv('slim_catalog.csv')

标签: python pandas dataframe


【解决方案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 呵呵,我实际上和几位物理学家一起工作(通过培训)。到目前为止,他们都是可靠的编码人员,但毫无疑问,很多刚刚陷入熊猫等深渊的人需要学习一些东西
猜你喜欢
  • 2020-12-23
  • 1970-01-01
  • 2018-05-20
  • 2021-07-15
  • 2014-10-01
  • 2018-11-26
  • 2018-06-06
  • 2021-05-18
  • 2022-01-27
相关资源
最近更新 更多