【问题标题】:Is it possible to avoid using a double for loop是否可以避免使用双 for 循环
【发布时间】:2017-01-23 13:29:17
【问题描述】:

我必须使用双 for 循环来循环遍历数据以将一行数据与其他行进行比较。我必须对每一行都这样做。

不幸的是,我的真实数据长达数百万行,并且循环需要很长时间才能处理。

有没有办法避免使用双 for 循环?由于我只对比较 Date1 和 date2 的相似事物感兴趣 - 我想我可以 groupby Thing 并将双 for 循环应用于每个组?

但我不知道如何写这个,因为 len(grouped) 有一个复杂性。还有很多行“数量”=0,因此这些行不需要包含在计算中。提前感谢您的帮助。

    d={'Thing':['Thing1','Thing2','Thing1','Thing2','Thing5'],'Date1' : 
    ['01-01-2016','02-02-2015','03-03-2015','03-03-2015', '24-03-2016'], 'Date2' : ['04-04-2015','03-03-2014','05-04-2015','07-03-2015','03-04-2016'], 
    'Quantity':[1,1,1,1,0]}

    data=pd.DataFrame(d)

    data['Level']=0

    for i in range(0,len(data)):
        for j in range(i+1,len(data)):
            if data['Thing'][i] == data['Thing'][j] and data['Date1'][i] >= data['Date1'][j] 
            and data['Date1'][i] < data['Date2'][j] and data['Quantity']==1:
                data['Level'][i]=data['Level'][i]+1 
                data['Level'][j]=data['Level'][j]+1

【问题讨论】:

  • 你想做什么??应该比较或更新什么代码或?..
  • 经验法则:如果您发现自己在 pandas 中使用 for 循环,那么您很可能做错了什么。
  • 首先,永远不要在 pandas 中使用普通的for-loops,总是使用内置的迭代器,例如iterrows 并使用 lociloc 索引您的行。
  • Date1 表示到达,date2 表示离开 - 对于每一行,我想知道当这个项目(行)时,还有多少相同类型的事物仍有库存(已到达但尚未离开)到达。这更清楚吗?感谢您的帮助。

标签: python pandas for-loop group-by


【解决方案1】:

我会尝试执行自加入:

merged_data = data.merge(data, on='Thing', how='outer')

结果如下:

merged_data
      Date1_x     Date2_x  Quantity_x   Thing     Date1_y     Date2_y  \
0  01-01-2016  04-04-2015           1  Thing1  01-01-2016  04-04-2015   
1  01-01-2016  04-04-2015           1  Thing1  03-03-2015  05-04-2015   
2  03-03-2015  05-04-2015           1  Thing1  01-01-2016  04-04-2015   
3  03-03-2015  05-04-2015           1  Thing1  03-03-2015  05-04-2015   
4  02-02-2015  03-03-2014           1  Thing2  02-02-2015  03-03-2014   
5  02-02-2015  03-03-2014           1  Thing2  03-03-2015  07-03-2015   
6  03-03-2015  07-03-2015           1  Thing2  02-02-2015  03-03-2014   
7  03-03-2015  07-03-2015           1  Thing2  03-03-2015  07-03-2015   
8  24-03-2016  03-04-2016           0  Thing5  24-03-2016  03-04-2016   
   Quantity_y  
0           1  
1           1  
2           1  
3           1  
4           1  
5           1  
6           1  
7           1  
8           0  

那么文件管理器就是你喜欢的:

merged_data[(...) & (...)]

【讨论】:

  • (这不是一个完整的解决方案,因为不清楚您到底需要什么,但从这个到完整的解决方案应该很简单)
猜你喜欢
  • 2020-09-16
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多