熊猫DataFrame花费太长时间

时间:2019-12-17 20:30:23

标签: python pandas dataframe

我正在将近30万行的文件上运行以下代码。我知道我的代码效率不高,因为它要花很长时间才能完成,有人可以建议我如何加快速度吗?

import sys
import numpy as np
import pandas as pd


file = sys.argv[1]

df = pd.read_csv(file, delimiter=' ',header=None)
df.columns = ["ts", "proto", "orig_bytes", "orig_pkts", "resp_bytes", "resp_pkts", "duration", "conn_state"]

orig_bytes = np.array(df['orig_bytes'])
resp_bytes = np.array(df['resp_bytes'])


size = np.array([])
ts = np.array([])
for i in range(len(df)):
    if orig_bytes[i] > resp_bytes[i]:
        size = np.append(size, orig_bytes[i])
        ts = np.append(ts, df['ts'][i])
    else:
        size = np.append(size, resp_bytes[i])
        ts = np.append(ts, df['ts'][i])

目标是仅记录两个实例之一(orig_bytes或resp_bytes)较大的实例。

感谢大家的帮助

1 个答案:

答案 0 :(得分:0)

我不能保证运行速度会比您现有的快,但这是到达您要去的地方的更直接的路线。另外,根据您的示例,我假设您不希望保留两个字节值相等的实例,并且最终希望使用单独的DataFrame,而不是现有df中的新列:

在创建DataFrame并重命名了列之后,可以使用查询删除orig_bytes和resp_bytes相同的所有实例,创建两个值都为最大值的新列,然后缩小DataFrame的范围。到您想要的两列。

df = pd.read_csv(file, delimiter=' ',header=None)
df.columns = ["ts", "proto", "orig_bytes", "orig_pkts", "resp_bytes", "resp_pkts", "duration", "conn_state"]

df_new = df.query("orig_bytes != resp_bytes")
df_new['biggest_bytes'] = df_new[['orig_bytes', 'resp_bytes']].max(axis=1)
df_new = df_new[['ts', 'biggest_bytes']]

如果您确实想在彼此相等的位置包含条目,则只需跳过查询步骤。