3 回答
![?](http://img1.sycdn.imooc.com/5458655200013d9802200220-100-100.jpg)
TA贡献1784条经验 获得超7个赞
您遇到的问题是因为您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, header=False, index=False)
在这里,我介绍了该DataFrame.query方法,该方法通常比尝试创建一个布尔系列用作掩码更简洁。
f 字符串语法仅适用于 python 3.6+,如果您使用的是较低版本,请进行适当修改(例如df_filter = "COND == '{}'".format(condition))
![?](http://img1.sycdn.imooc.com/545862770001a22702200220-100-100.jpg)
TA贡献1776条经验 获得超12个赞
我们可以编写条件然后dict使用map过滤之前的 dfgroupby
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')
![?](http://img1.sycdn.imooc.com/545863e80001889e02200220-100-100.jpg)
TA贡献1829条经验 获得超9个赞
df=pd.DataFrame({'COND':['X','X','X','Y','Y','Y'], 'VALUE':[1,2,3,1,2,3]})
conditions = df.COND
for condition in conditions:
print(condition)
df2=df[df['COND'].isin([condition])][['VALUE']]
df2.to_csv(condition + '_values.txt',header=False, 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',header=False, index=False)
您没有指定变量“条件”,因此它给您一个错误。尝试做:
条件 = df.COND
在for循环之前
添加回答
举报