gpt4 book ai didi

python - 有没有办法加快以下 pandas for 循环?

转载 作者:太空狗 更新时间:2023-10-29 21:48:23 24 4
gpt4 key购买 nike

我的数据 框架包含 10,000,000 行! group by 后,还有约 9,000,000 个子帧需要循环。

代码是:

data = read.csv('big.csv')
for id, new_df in data.groupby(level=0): # look at mini df and do some analysis
# some code for each of the small data frames

这是非常低效的,代码现在已经运行了 10 多个小时。

有什么办法可以加快速度吗?

完整代码:

d = pd.DataFrame() # new df to populate
print 'Start of the loop'
for id, new_df in data.groupby(level=0):
c = [new_df.iloc[i:] for i in range(len(new_df.index))]
x = pd.concat(c, keys=new_df.index).reset_index(level=(2,3), drop=True).reset_index()
x = x.set_index(['level_0','level_1', x.groupby(['level_0','level_1']).cumcount()])
d = pd.concat([d, x])

获取数据:

data = pd.read_csv('https://raw.githubusercontent.com/skiler07/data/master/so_data.csv', index_col=0).set_index(['id','date'])

注意:

大多数 ID 只有 1 个日期。这表示只有 1 次访问。对于访问次数较多的 id,我想以 3d 格式构建它们,例如将他们的所有访问存储在 3 个维度中的第 2 个维度中。输出为 (id, visits, features)

最佳答案

这是加快速度的一种方法。这会在一些直接处理行的代码中添加所需的新行。这节省了不断构建小数据帧的开销。您的 100,000 行样本在我的机器上运行了几秒钟。虽然只有 10,000 行示例数据的代码需要 > 100 秒。这似乎代表了几个数量级的改进。

代码:

def make_3d(csv_filename):

def make_3d_lines(a_df):
a_df['depth'] = 0
depth = 0
prev = None
accum = []
for row in a_df.values.tolist():
row[0] = 0
key = row[1]
if key == prev:
depth += 1
accum.append(row)
else:
if depth == 0:
yield row
else:
depth = 0
to_emit = []
for i in range(len(accum)):
date = accum[i][2]
for j, r in enumerate(accum[i:]):
to_emit.append(list(r))
to_emit[-1][0] = j
to_emit[-1][2] = date
for r in to_emit[1:]:
yield r
accum = [row]
prev = key

df_data = pd.read_csv('big-data.csv')
df_data.columns = ['depth'] + list(df_data.columns)[1:]

new_df = pd.DataFrame(
make_3d_lines(df_data.sort_values('id date'.split())),
columns=df_data.columns
).astype(dtype=df_data.dtypes.to_dict())

return new_df.set_index('id date'.split())

测试代码:

start_time = time.time()
df = make_3d('big-data.csv')
print(time.time() - start_time)

df = df.drop(columns=['feature%d' % i for i in range(3, 25)])
print(df[df['depth'] != 0].head(10))

结果:

1.7390995025634766

depth feature0 feature1 feature2
id date
207555809644681 20180104 1 0.03125 0.038623 0.008130
247833985674646 20180106 1 0.03125 0.004378 0.004065
252945024181083 20180107 1 0.03125 0.062836 0.065041
20180107 2 0.00000 0.001870 0.008130
20180109 1 0.00000 0.001870 0.008130
329567241731951 20180117 1 0.00000 0.041952 0.004065
20180117 2 0.03125 0.003101 0.004065
20180117 3 0.00000 0.030780 0.004065
20180118 1 0.03125 0.003101 0.004065
20180118 2 0.00000 0.030780 0.004065

关于python - 有没有办法加快以下 pandas for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49317991/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com