我在一个接近300k行的文件上运行下面的代码。我知道我的代码不是很有效率,因为它需要很长的时间来完成,谁能告诉我如何才能加快它?
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)。 谢谢你们所有人的帮助 问题来源StackOverflow 地址:/questions/59381664/pandas-dataframe-takes-too-long
我不能保证它会比你现有的跑得快,但它是一条更直接的路线,你可以去你想去的地方。另外,我假设基于你的例子,你不想让两个字节值相等的实例,你想要一个单独的DataFrame在最后,而不是一个新的列在现有的df: 在您创建了DataFrame并对列进行了重命名之后,您可以使用query删除所有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']]
如果您确实希望在它们彼此相等的地方包含条目,那么只需跳过查询步骤。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。