use*_*167 5 python dataframe pandas
我有一个包含约 230 万行的 csv 文件。我想保存数据帧内两列中具有非 nan 值的行的子集(~1.6M)。我想继续使用 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)
Run Code Online (Sandbox Code Playgroud)
catalog它保存具有非 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')
Run Code Online (Sandbox Code Playgroud)
原则上这应该可行。通过将每一行读入字典中,速度会加快一些。然而,执行所有 230 万行的时间太长了。有什么更好的方法来解决这个问题?
这是在 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')
Run Code Online (Sandbox Code Playgroud)
或者分解为可能更具可读性:
not_nan_zB = catalog.loc[:, ['z', 'B']].notna().all(axis=1)
catalog[not_nan_zB].to_csv('slim_catalog.csv')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
315 次 |
| 最近记录: |