gpt4 book ai didi

Python:循环中IF语句的处理不一致

转载 作者:行者123 更新时间:2023-12-04 00:15:55 24 4
gpt4 key购买 nike

我有一个包含条件和值的数据框 df

import pandas as pd
df=pd.DataFrame({'COND':['X','X','X','Y','Y','Y'], 'VALUE':[1,2,3,1,2,3]})

因此 df 看起来像:

  COND  VALUE
X 1
X 2
X 3
Y 1
Y 2
Y 3

我正在使用循环根据 CONDdf 进行子集化,并编写包含每个条件值的单独文本文件

conditions = {'X','Y'}
for condition in conditions:
df2 = df[df['COND'].isin([condition])][['VALUE']]
df2.to_csv(condition + '_values.txt', header=False, index=False)

最终结果是两个文本文件:X_vals.txt 和 Y_vals.txt,它们都包含 1 2 3。到目前为止,一切都按预期工作。

我想进一步子集 df 仅用于一个条件。例如,也许我想要条件 Y 的所有值,但只有条件 X 的值 < 3。在这种情况下,X_vals.txt 应该包含 1 2 而 Y_vals.txt 应该包含 1 2 3。我尝试用 IF 语句实现它:

conditions = {'X','Y'}
for condition in conditions:
if condition == 'X':
df = df[df['VALUE'] < 3]

df2 = df[df['COND'].isin([condition])][['VALUE']]
df2.to_csv(condition + '_values.txt', header=False, index=False)

这就是不一致发生的地方。上面的代码工作正常(即 X_vals.txt 包含 1 2 和 Y_vals.txt 1 2 3,如预期的那样),但是当我使用 if condition= ='Y' 而不是 if condition=='X',它会中断,并且两个文本文件都只包含 1 2

换句话说,如果我在 IF 语句中指定 conditions 的第一个元素,那么它会按预期工作,但是如果我指定第二个元素,它就会中断并将 <3 子集应用于值从这两种情况。

这是怎么回事,我该如何解决?

谢谢!

最佳答案

您遇到的问题是因为您在循环内覆盖了 df

conditions = {'X','Y'}
for condition in conditions:
if condition == 'X':
df = df[df['VALUE'] < 3] # <-- HERE'S YOUR ISSUE

df2 = df[df['COND'].isin([condition])][['VALUE']]
df2.to_csv(condition + '_values.txt', header=False, index=False)

让我有点吃惊的是,当你循环设置 conditions 时,你首先得到 condition = 'Y'then 条件 = 'X'。但是由于集合是一个无序集合(即它没有声称其元素具有固有的顺序),这不应该太令人不安:python 只是在最多读取元素内部方便的方式。

您可以使用 conditions = ['X', 'Y'] 来循环遍历列表(有序集合)。然后它将先执行 X,然后执行 Y。但是,如果您这样做,您将得到相同的错误但相反(即它适用于 if condition == 'Y' 但不适用于 if条件 == 'X')。

这是因为在循环运行一次后,df 已重新分配给原始 df 的子集,该子集仅包含小于 3 的值。这就是为什么如果 if 条件 语句在 first pass through the loop 时触发,那么您在两个文件中只能得到值 1 和 2。

现在进行修复:


conditions = ['X', 'Y']

for condition in conditions:

csv_name = f"{condition}_values.txt"

if condition == 'X':
df_filter = f"VALUE < 3 & COND == '{condition}'"
else:
df_filter = f"COND == '{condition}'"

df.query(df_filter).VALUE.to_csv(csv_name, header=False, index=False)

这里我介绍了 DataFrame.query 方法,它通常比尝试创建一个 bool 系列用作掩码更简洁。

f-string 语法仅适用于 python 3.6+,如果您使用的是较低版本,请根据需要进行修改(例如 df_filter = "COND == '{}'".format(condition))

关于Python:循环中IF语句的处理不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63757209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com