Python For循环等价于减少数据帧操作中的执行时间
我编写了一个for循环,如下所示:Python For循环等价于减少数据帧操作中的执行时间,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我编写了一个for循环,如下所示: for i in newc2sdf.Source.unique(): ydf=newc2sdf[newc2sdf.Source==i] for j in newc2sdf.Destination.unique(): ydf1=ydf[ydf.Destination==j] 由于我有这么多独特的记录,执行起来需要很长时间 我将从ydf1执行一些基本操作,它将返回一个值,并将该值附加到列表中 我想计算另一列的值之和,其中源和目标是
for i in newc2sdf.Source.unique():
ydf=newc2sdf[newc2sdf.Source==i]
for j in newc2sdf.Destination.unique():
ydf1=ydf[ydf.Destination==j]
由于我有这么多独特的记录,执行起来需要很长时间
我将从ydf1执行一些基本操作,它将返回一个值,并将该值附加到列表中 我想计算另一列的值之和,其中源和目标是唯一的
我还有一个列叫做timestamp(ex:2016-08-01 00:10:01),它是numpy.datetime64格式的,我想要时间戳的总和比特定源到目标的最小时间戳多5分钟
是否有其他方法可以减少执行时间。给定以下示例数据帧:
newc2sdf = pd.DataFrame([['Home','Seattle',3],['Vacation','San Francisco',74],['Work','Portland',9],
['Vacation','Seattle',24],['Work','Portland',4],['Home','Seattle',5],
['Work','Portland',31],['Vacation','San Francisco',19],['Work','San Francisco',38],
['Home','Seattle',85],['Work','San Francisco',32],['Vacation','Seattle',73]],
columns=['Source','Destination','Value'])
其中:
Source Destination Value
0 Home Seattle 3
1 Vacation San Francisco 74
2 Work Portland 9
3 Vacation Seattle 24
4 Work Portland 4
5 Home Seattle 5
6 Work Portland 31
7 Vacation San Francisco 19
8 Work San Francisco 38
9 Home Seattle 85
10 Work San Francisco 32
11 Vacation Seattle 73
要计算“源和目标将是唯一的另一列的值之和”,我可以想象您正在查找groupby()
和agg()
:
收益率:
Value
Source Destination
Home Seattle 93
Vacation San Francisco 93
Seattle 97
Work Portland 44
San Francisco 70
最后,如果要将这列值存储到列表中:
newc2sdf.groupby(['Source','Destination']).agg({'Value': 'sum'})['Value'].tolist()
在循环的每次迭代中,您都会在此处覆盖
ydf1
。我怀疑这是您的意图。为什么您希望源和目标的每个组合都有一个单独的数据帧?如果你给出一点关于这将允许你实现什么的上下文,那么回答你的问题就会更容易。我将从ydf1执行一些基本操作,它将返回一个值,我将在列表中附加该值。我只是想减少执行时间。我有另一列名为timestamp(ex:2016-08-01 00:10:01),格式为numpy.datetime64,我想要的是那些时间戳将比特定源到目的地的最小时间戳多5分钟的总和。这是一个与您最初发布的问题完全不同的问题。抱歉。我尝试使用for循环,它提供了过滤后的数据帧,我可以在其中计算其余的数据。但这需要很长时间。我正在寻找一些解决方案,如你所张贴的,我感谢。
newc2sdf.groupby(['Source','Destination']).agg({'Value': 'sum'})['Value'].tolist()