亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python:循環中 IF 語句的處理不一致

Python:循環中 IF 語句的處理不一致

元芳怎么了 2023-07-18 10:35:01
我有一個df包含條件和值的數據框。import pandas as pddf=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我正在使用循環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', header=False, index=False)這就是不一致的地方。上面的代碼工作正常(即 X_vals.txt 包含1 2, 和 Y_vals.txt 1 2 3,按預期),但是當我使用if condition=='Y'而不是 時if condition=='X',它會中斷,并且兩個文本文件都只包含1 2.換句話說,如果我conditions在 IF 語句中指定第一個元素,那么它會按預期工作,但是如果我指定第二個元素,那么它會中斷并將 < 3 子集應用于兩個條件中的值。這是怎么回事?我該如何解決?
查看完整描述

3 回答

?
嚕嚕噠

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))


查看完整回答
反對 回復 2023-07-18
?
叮當貓咪

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')


查看完整回答
反對 回復 2023-07-18
?
PIPIONE

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循環之前


查看完整回答
反對 回復 2023-07-18
  • 3 回答
  • 0 關注
  • 184 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號