- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含条件和值的数据框 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
我正在使用循环根据 COND
对 df
进行子集化,并编写包含每个条件值的单独文本文件
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/
我是一名优秀的程序员,十分优秀!