微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Python:循环中对IF语句的不一致处理

我有一个数据框df,其中包含条件和值。

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

因此df如下:

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

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

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',index=False)

在此处出现不一致的地方。上面的代码可以正常工作(即X_vals.txt包含1 2,Y_vals.txt 1 2 3,按预期方式),但是当我使用if condition=='Y'而不是if condition=='X'时,它会中断,并且两个文本文件都只包含1 2

换句话说,如果我在IF语句中指定conditions的第一个元素,那么它将按预期工作,但是,如果我指定了第二个元素,则它将中断并将

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

谢谢!

解决方法

您遇到的问题是由于您在循环内覆盖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',然后然后 condition = 'X'。但是,由于集合是一个无序集合(即它并不声称其元素具有固有的顺序),因此这应该不会太令人不安:python只是从最外层读取元素内部方便的方式。

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

这是因为在循环运行一次之后,df已被重新分配给仅包含小于三个值的原始df的子集。因此,如果if condition语句在首次通过循环时触发,则在两个文件中都只能得到值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,index=False)

在这里,我介绍了DataFrame.query方法,该方法通常比尝试创建布尔序列用作掩码时更简洁。

f字符串语法仅在python 3.6及更高版本上有效,如果您使用的是较低版本,请适当修改(例如df_filter = "COND == '{}'".format(condition)

,

我们可以将条件写入dict,然后在map之前使用groupby过滤df

cond = {'X' : 2,'Y' : 3}
subdf = df[df['VALUE']<df.COND.map(cond)]
for x,y in subdf.groupby('COND'):
    y.to_csv(x + '_values.txt')
,
df=pd.DataFrame({'COND':['X','X','Y','Y'],'VALUE':[1,2,3,1,3]})

conditions = df.COND

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


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',index=False)

您没有指定变量“ Condition”,所以它给您一个错误。 尝试做:

条件= df.COND

for循环之前

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。