我正在将近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)较大的实例。
感谢大家的帮助
答案 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']]
如果您确实想在彼此相等的位置包含条目,则只需跳过查询步骤。