【问题标题】:For loop repeats first iteration twice - pythonFor循环重复第一次迭代两次 - python
【发布时间】:2023-07-24 04:48:01
【问题描述】:

我在 python 脚本中遇到以下问题: 我有一个简单的 for 循环,它遍历一个列表并为另一个函数传递 2 个参数以获取一些数据。

运行调试我看到循环通过 for 循环中的所有 6 个项目都可以正常工作,没有任何问题,但是由于某种奇怪的原因,它尝试再次重复第一对参数。

此时我收到一个 pandas 错误:“只能比较标记相同的系列对象”(for 循环将参数传递给一个切片更大 df 的函数,尽管我认为它与这个问题无关。)重要的是,循环第一次通过该组合运行时,它工作正常。

有人遇到过这样的事情吗?

尝试图形解释:

Params = [[a,b],[c,d],[e,f],[g,h],[i,j],[k,l]]
For item in Params:
  df' = df.loc[[df['A'] == item]

我的意思是 par [a,b] 通过两次,在其“第二次”传递中抛出 pandas 错误。

根据要求添加更完整的代码:

data = pd.DataFrame ['包含一个日期时间索引,一个名为 'name' 的列,其值包括 'A'、'S'、'F' 和其他 100 个值,每个列都有一个名为 'value' 的列日期和名称],代码试图完成的是将其切成更精简的 df,其中包含特定日期范围(开始,结束)内的“名称”和“值”的子集,这样我就可以在其他地方更轻松地使用和操作我的代码。

pairs = [['A', 'S'], ['A', 'F'], ['S', 'A'], ['S', 'F'], ['F' , 'A'], ['F', 'S']], 对包含“数据”列子集的所有排列,在这种情况下,选择 3 列通过“call_pair_data”,因此有 6 个排列。

代码本身:

for index, item in enumerate(pairs):
 x = item[0]
    y = item[1]
    df = call_pair_data(x, y, start, end)

def call_pair_data(x, y, start, end):
    df_x = data.loc[start : end]
    df_x = df_x.loc[df_x['name'] == x]
    df_y = data.loc[start : end]
    df_y = df_y.loc[df_y['name'] == y]
    pair_df = pd.merge(df_x,df_y, on=['Date'], suffixes=['_x','_y'])
    return(pair_df)

【问题讨论】:

  • 这不是您的代码,因为该代码当然没有问题。 Python 不会再任意运行你的循环。我的猜测是您正在修改您的列表作为处理的一部分,因此它会尝试再次运行它们。
  • 我们无法运行此代码来查看此问题 - 所以我们无法为您提供帮助。更好地展示我们可以复制和运行的最小工作代码。
  • @TimRoberts 和 furas,对不起...我将尝试在上面进行编辑以改进它。试图简化,因为这来自难以复制的较大代码(我对python相当陌生)。一会儿回来。
  • 设法找到解决方案 -- Tim / furas 你是对的,上面的代码没有错,错误是在其他地方导致“x”值通过这个代码传递到 [df_x['name '] == x] 是错误的,导致错误,但这是在“call_pair_data”函数的另一个调用中,而不是在上面的那个......很高兴知道“for”仍然有效,我是假人。 @蒂姆罗伯茨

标签: python pandas for-loop


【解决方案1】:

使用.isin() 方法会更简单高效:

for pair in pairs: 
    res_df = df.loc[(df[start:end]) & (df['name'].isin(pair))]

或者

for pair in pairs
    res_df = df[start:end].loc[df['name'].isin(pair)]

这个方法接受一个列表或元组作为参数,所以这也是有效的;

for pair in pairs: 
    res_df = df[start: end].loc[df['name'].isin([pair[0], pair[1]])

【讨论】:

  • 非常感谢您的建议,我的代码远非干净......所以,它帮助我超越了问题(如上所述已解决)。
  • 没问题。 Pandas 有很多“晦涩”的方法,最好先检查其中一个是否符合您的要求。