【问题标题】:multiple for loop to select special rows from a dataframe in python多个for循环从python中的数据框中选择特殊行
【发布时间】:2016-09-29 22:46:44
【问题描述】:

我在 python 中有一个大数据框,我想根据多个 for 循环选择特定的行。有些列中包含列表。我的最终目标是生成一些优化约束并将它们传递给另一个软件:

   T        S        W     Arrived    Departed     
  [1,2]    [4,2]     1        8          10
  [3,4,5]   [3]      1        12         18
  [6,7]    [1,2]     2        10         11
    .        .       .        .          .
    .        .       .        .          .

  def Cons(row):

    if row['W'] == w and sum(pd.Series(row['T']).isin([t])) != 0 and sum(pd.Series(row['S']).isin([s])) != 0:
           return 1

  for w in range(50):
      for s in range(30):
          for t in range(12):
              df.Situation = df.apply(Cons, axis = 1)
              A = df[ (df.Situation == 1) ] 
              A1 = pd.Series(A.Arrived).tolist()
              D1 = pd.Series(A.Departed).tolist()
              Time = tuplelist(zip(A1,D1))

我怎样才能有效地做到这一点,因为通过多个 for 循环需要很长时间才能运行?

【问题讨论】:

  • 从您的代码来看,嵌套循环只经过 50 * 30 * 12 = 18000 次迭代。假设最内层循环的主体不做任何计算密集型的事情,这应该不是问题。
  • @xuanluong,他的算法是O(n^3),这对大数据来说不是那么好——但对于小迭代我同意你的看法并没有那么糟糕
  • @coder 嗯,大数据,但有多大?也许 OP 应该提供更多关于数据数量级的上下文。否则,三次时间复杂度是足够好还是太慢只是任何人的猜测。
  • 用这种格式运行很慢。
  • 我编辑了我的主要问题。抱歉,我是初学者,每一步都可能看起来效率不高。

标签: python for-loop dataframe


【解决方案1】:

目前,您不断调整每个嵌套循环的数据框,其中 A 每次都被重写,并且不会产生增长的结果,而只会产生非常非常最后一次迭代的结果。

但考虑创建所有范围的交叉连接,然后检查相等逻辑:

wdf = pd.DataFrame({'w': range(50), 'key': 1})
sdf = pd.DataFrame({'s': range(30), 'key': 1})
tdf = pd.DataFrame({'t': range(12), 'key': 1})

dfs = [wdf, sdf, tdf]

# DATA FRAME OF CROSS PRODUCT w X s X T (N = 18,000)
rangedf = reduce(lambda left,right: pd.merge(left, right, on=['key']), dfs)[['w','s','t']]
#    w  s  t
# 0  0  0  0
# 1  0  0  1
# 2  0  0  2
# 3  0  0  3
# 4  0  0  4
# ...

def Cons(row):    
    if any((rangedf['w'].isin([row['W']])) & (rangedf['t'].isin([row['T']])) & \
           (rangedf['s'].isin([row['S']]))) == True:
        return 1

df.Situation = df.apply(Cons, axis = 1)
A = df[ (df.Situation == 1) ].reset_index(drop=True)

【讨论】:

  • 非常感谢。您的代码是否允许我在每次迭代中使用“A”,因为我想使用它?
  • 此处已删除迭代。我的理解是你只想要一个 A 数据框而不是 18,000 个!请说明您希望如何使用每个 A
  • 您是否有理由需要遍历 w、t、s 的所有这些组合?你最终会用这 18,000 个 Time 对象做什么? tuplelist() 是什么模块?
  • 我需要为优化问题的每个组合添加一个约束。我使用“时间”对象来查找选定行的“到达”和“离开”的值。
猜你喜欢
  • 2020-06-23
  • 2021-12-31
  • 2015-06-15
  • 2022-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多