我有一个非常大的熊猫数据框,有28171643行和4列。该数据帧一天的子集如下所示
我现在的任务是计算每天pair
的总金额。天数从90天到320天不等。请注意,(如名称所示)reversed
列在每一行中始终包含来自pair
列的翻转元组
这里有一个例子:
第0行、第1行、第2行和第4行都包含相同的元组组合,无论它是在pair
列还是reversed
列中,因此需要求和为5+17+1604+1558=3184。理想情况下,此信息存储在一个新的数据框中,其中包含day
、amount
和tuple
列。不管tuple
是否包含来自pair
或reversed
的值,因为组合不是定向的
我在下面展示了一个解决方案,但对于这个庞大的数据集来说,这需要花费太长的时间! 作为硬件,我有一个48核186GB RAM的工作站和一个Quadro RTX 8000 GPU。如果有一个简单的解决方案,例如使用Dask或rapids.ai这是完全正确的
我每天的缓慢方法:
如果有一种方法可以将其并行化,它也会有所帮助
def analysis(d, t):
combinations_df = d.loc[d['day'] == t]
index = []
for idx, row in combinations_df.iterrows():
idd = combinations_df[combinations_df['reversed'] == row['pair']].index
if len(idd) != 0:
index.append(idd[0])
else:
index.append(-1)
combinations_df['reversed_idx'] = index
skippy = []
to_drop = []
def add_occurences(row):
if row['reversed_idx'] == -1 or row['reversed_idx'] in skippy:
return row
else:
row['amount'] += combinations_df.loc[row['reversed_idx']]['amount']
skippy.append(row.name)
to_drop.append(row['reversed_idx'])
return row
res = combinations_df.apply(lambda x: add_occurences(x), axis=1)
skippy = set(skippy)
to_drop = list(set(to_drop))
return res.drop(to_drop)[['day', 'amount', 'pair']]
请考虑将一些示例添加为代码而不是^ {< CD1>},因为这将使您的代码更容易使用。p>
您可以做的是
groupby
对,然后聚集amount
的摘要如果上表为
df
,您可以执行以下操作:与前面使用groupby和agg的响应类似,但在唯一键组合上求和:
对于一个5000长度的随机数据帧,使用您的函数在几天内进行循环对我来说需要4.38秒±204毫秒,现在,我是9.86毫秒±185微秒
相关问题 更多 >
编程相关推荐