如何解决Python:循环中对IF语句的不一致处理
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 举报,一经查实,本站将立刻删除。