【问题标题】:How do I skip a for loop iteration if a condition is met when iterating through multiple files in pandas?如果在遍历 pandas 中的多个文件时满足条件,如何跳过 for 循环迭代?
【发布时间】:2021-08-14 17:34:03
【问题描述】:

我首先使用 os 和 glob 创建一个 CSV 列表,然后使用简单的 for 循环遍历应用我的代码的路径中的所有文件。

path = r'my path'
os.chdir(path)
FileList = glob.glob('*.csv')

for fname in FileList:
Session = pd.read_csv(fname, header = 3, usecols = [0, 1])
Session = Session[Session['System'].str.contains('Day', na=False)]
Session = Session['No System Name'].tolist()
CRFs = sum(["CRF" in x for x in Session])
...
df.to_csv(path + 'test_' + fname , index = 0)

如果 Session 的长度等于 CRF,是否有一种方法可以使循环跳过文件,循环将停止并使用 FileList 中的下一个文件重新开始? 我尝试过同时使用 break 和 continue 来这样做,但什么都没做:

for fname in FileList:

Session = pd.read_csv(fname, header = 3, usecols = [0, 1])
Session = Session[Session['System'].str.contains('Day', na=False)]
Session = Session['No System Name'].tolist()
CRFs = sum(["CRF" in x for x in Session])
if CRFs == len(Session) is True: 
    continue(or break)
...
df.to_csv(path + 'test_' + fname , index = 0)

非常感谢!

【问题讨论】:

  • 使用continue?喜欢if <your condition> is True: continue。
  • 我已经尝试了很多不同的方法,但它似乎不起作用。根据一个列表中特定元素的数量是否与另一个列表的长度匹配,我在 pd.read 之后可能需要跳过的点之前有大约 200 行代码
  • 我没听懂你。那么continue 没有按预期工作吗?或者您无法根据您的情况应用它?当你说你想跳过时,你想放弃在那之前你在那个循环中所做的一切并移动到下一个权利?也许编辑你的问题,详细说明你在做什么和你想要什么。
  • 对不起,我会尝试更清楚一点,continue 按照您的建议使用时什么都不做,而且我对 Python 基本原理的了解不足以弄清楚为什么会这样(我是通过隧道视觉学习的熊猫专门帮助我解决之前没有编码经验的实验室研究的数据处理问题)。是的,您的理解是正确的,我希望它停止正在做的事情并继续下一个文件。我已经编辑了原始问题,希望现在更清楚了
  • 我已经回复了。检查它现在是否有效。

标签: python pandas loops dynamic


【解决方案1】:

当某些情况发生时,您可以打破主循环,请查看有关此主题的official documentation。

【讨论】:

    【解决方案2】:

    是的!我相信continue 声明正是您要寻找的。​​p>

    执行时,continue 语句将导致当前循环迭代的执行结束,并开始下一次迭代。

    python 文档中的示例:

    >>> for num in range(2, 10):
    ...     if num % 2 == 0:
    ...         print("Found an even number", num)
    ...         continue
    ...     print("Found an odd number", num)
    ...
    Found an even number 2
    Found an odd number 3
    Found an even number 4
    Found an odd number 5
    Found an even number 6
    Found an odd number 7
    Found an even number 8
    Found an odd number 9
    

    【讨论】:

    • 我尝试了很多方法,但我无法真正弄清楚如何使其适应我的情况(出现语法错误或什么也没发生),有 200几行几乎纯粹的 pandas 代码,仅引用 fname 以将文件加载到循环中并在循环结束时保存文件。是不是我需要以某种方式显式引用 for 循环的对象(在本例中为 fname)才能使其工作???
    • 广义地说,你想要的是if condition: continue。没有看到你的代码,我不能比这更具体。
    • 我已更改示例以反映我的原始代码,希望对您有所帮助!
    【解决方案3】:

    而不是在您的代码中:

    if CRFs == len(Session) is True: 
        continue
    

    只要做:

    if CRFs == len(Session):
        continue
    

    【讨论】:

    • More information about why this is the case. "如果两个对象是同一个对象,则测试返回 True。如果它们不是同一个对象,即使两个对象 100% 相等,测试也会返回 False。" - w3schools.com
    • @John Paul R answer 很好地解释了 continue 的工作原理。浏览他提供的链接以了解更多关于循环结构的信息。
    • 感谢两位提供的优秀信息,这些是我试图弥合的知识差距。我发现官方 Python 文档与有用相反,因为它经常以增加而不是删除复杂性的方式解释概念,w3schools 看起来是一个很好的参考源。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-08-29
    • 2019-02-03
    • 2019-06-10
    • 2020-06-16
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多