Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对于每一天,获取一个非常大的数据帧中两个特定列中匹配的所有行的总和_Python_Pandas_Parallel Processing_Dask_Large Data - Fatal编程技术网

Python 对于每一天,获取一个非常大的数据帧中两个特定列中匹配的所有行的总和

Python 对于每一天,获取一个非常大的数据帧中两个特定列中匹配的所有行的总和,python,pandas,parallel-processing,dask,large-data,Python,Pandas,Parallel Processing,Dask,Large Data,我有一个非常大的熊猫数据框,有28171643行和4列。该数据帧一天的子集如下所示 我现在的任务是计算pair每天的总金额。天数从90天到320天不等。请注意(如名称所示),reversed列在每行中始终包含来自列pair的翻转元组 这里有一个例子: 第0行、第1行、第2行和第4行都包含相同的元组组合,无论它是在列pair还是reversed中,因此需要求和为5+17+1604+1558=3184。理想情况下,此信息存储在一个新的数据框中,其中包含day、amount和tuple。无论tuple

我有一个非常大的熊猫数据框,有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分析(d,t):
组合_df=d.loc[d['day']==t]
索引=[]
对于idx,组合中的行_df.iterrows():
idd=combinations_-df[combinations_-df['reversed']==行['pair']]。索引
如果len(idd)!=0:
index.append(idd[0])
其他:
index.append(-1)
组合_df['reversed_idx']=索引
skippy=[]
到_drop=[]
def添加_事件(行):
如果skippy中的行['reversed\u idx']=-1或行['reversed\u idx']:
返回行
其他:
行['amount']+=组合_df.loc[行['reversed\'idx']]['amount']
skippy.append(row.name)
to_drop.append(第['reversed_idx']行)
返回行
res=组合方向应用(λx:添加发生次数(x),轴=1)
skippy=设置(skippy)
to_drop=列表(设置(to_drop))
返回res.drop(to_drop)[“天”、“金额”、“对”]]

< P>请考虑添加一些代码作为代码,而不是<代码> IMG,因为这将使您的代码更容易工作。

您可以做的是将
groupby
配对,然后将
amount
汇总

如果上表是
df
,您可以执行以下操作:

>>> df = {'day': [226, 226, 226, 226, 226],
 'amount': [5, 17, 1604, 127, 1558],
 'pair': ['(B2141043,B2161043)',
  '(B2141043,B2161043)',
  '(B2141043,B2161043)',
  '(B2141043,C22D1043)',
  '(B2141043,B2161043)'],
 'reversed': ['(B2161043,B2141043)',
  '(B2161043,B2141043)',
  '(B2161043,B2141043)',
  '(C22D1043,B2141043)',
  '(B2161043,B2141043)']}

>>> df.groupby('pair').agg({'day' : 'first','amount': 'sum'})

                     day  amount
pair
(B2141043,B2161043)  226    3184
(B2141043,C22D1043)  226     127

请考虑将一些示例添加为代码而不是<代码> IMG,因为这将使您的代码更容易工作。

您可以做的是将
groupby
配对,然后将
amount
汇总

如果上表是
df
,您可以执行以下操作:

>>> df = {'day': [226, 226, 226, 226, 226],
 'amount': [5, 17, 1604, 127, 1558],
 'pair': ['(B2141043,B2161043)',
  '(B2141043,B2161043)',
  '(B2141043,B2161043)',
  '(B2141043,C22D1043)',
  '(B2141043,B2161043)'],
 'reversed': ['(B2161043,B2141043)',
  '(B2161043,B2141043)',
  '(B2161043,B2141043)',
  '(C22D1043,B2141043)',
  '(B2161043,B2141043)']}

>>> df.groupby('pair').agg({'day' : 'first','amount': 'sum'})

                     day  amount
pair
(B2141043,B2161043)  226    3184
(B2141043,C22D1043)  226     127

与前面使用groupby和agg的响应类似,但在唯一键组合上求和:

result = my_df.groupby(['day', my_df.pair.apply(set).apply(tuple)])[['amount']].agg('sum').reset_index()

使用5000长度的随机数据帧,使用您的函数在几天内进行循环,我需要4.38 s±204 ms,现在,我的速度为9.86 ms±185µs

与之前使用groupby和agg的响应类似,但在唯一键组合上求和:

result = my_df.groupby(['day', my_df.pair.apply(set).apply(tuple)])[['amount']].agg('sum').reset_index()

使用一个5000长度的随机数据帧,使用您的函数在几天内进行循环对我来说需要4.38 s±204 ms,现在,我的速度是9.86 ms±185µs

正是我想要的-非常感谢!正是我想要的-非常感谢!非常感谢您的帮助,但使用您的解决方案,我的数据帧中仍然有两个元组顺序@Boul的解决方案克服了这一问题。非常感谢您的帮助,但使用您的解决方案,我的数据框架中仍然有两个元组顺序@波尔的解决方案克服了这一点。