3 回答

TA貢獻1784條經(jīng)驗 獲得超7個贊
您遇到的問題是因為您df在循環(huán)內(nèi)覆蓋而出現(xiàn)的。
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讓我有點驚訝的是,當你循環(huán)遍歷你condition = 'Y'首先得到的集合時,然后 condition = 'X'. 但由于集合是無序集合(即它不聲稱其元素具有固有的順序),因此這不應(yīng)該太令人不安:Python 只是以最內(nèi)部方便的方式讀出元素。
您可以使用conditions = ['X', 'Y']循環(huán)列表(有序集合)來代替。然后它會先執(zhí)行 X,然后執(zhí)行 Y。但是,如果您這樣做,您將得到相同的錯誤,但方向相反(即它適用于if condition == 'Y'但不適用于if condition == 'X')。
這是因為循環(huán)運行一次后,df已被重新分配給原來df僅包含小于三的值的子集。if condition這就是為什么如果語句在第一次循環(huán)時觸發(fā),則兩個文件中僅獲得值 1 和 2 的原因。
現(xiàn)在進行修復(fù):
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方法,該方法通常比嘗試創(chuàng)建一個布爾系列用作掩碼更簡潔。
f 字符串語法僅適用于 python 3.6+,如果您使用的是較低版本,請進行適當修改(例如df_filter = "COND == '{}'".format(condition))

TA貢獻1776條經(jīng)驗 獲得超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')

TA貢獻1829條經(jīng)驗 獲得超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循環(huán)之前
添加回答
舉報