【问题标题】:If ElseIf Else condition in pandas dataframe list comprehension熊猫数据框列表理解中的 If ElseIf Else 条件
【发布时间】:2018-01-30 17:40:35
【问题描述】:

我有一个包含 11 列的数据框:Status1-Status5、Time1-Time5 和 Time_Min

df = pd.DataFrame([[100,200,150,400,500,'a','b','a','c','a',100], [300,400,200,500,250,'b','b','c','c','c',200]], columns=['TIME_1', 'TIME_2', 'TIME_3', 'TIME_4', 'TIME_5','STATUS_1','STATUS_2','STATUS_3','STATUS_4','STATUS_5','TIME_MIN'])

我想复制我目前在 SAS 中的代码,它执行以下操作

IF TIME_1 = TIME_MIN THEN STATUS = STATUS_1;
ELSE IF TIME_2 = TIME_MIN THEN STATUS = STATUS_2;
ELSE IF TIME_3 = TIME_MIN THEN STATUS = STATUS_3;
ELSE IF TIME_4 = TIME_MIN THEN STATUS = STATUS_4;
ELSE STATUS = STATUS_5;

STATUS 列的预期输出为

['a','c']

我尝试按照这些思路构建一些东西(需要使用 else ifs 进行扩展)

df['STATUS'] = [a if x == y else b for x,y,a,b in df[['TIME_MIN','TIME_1','STATUS_1','STATUS_2']]]

但这只是给出了一个错误。我敢肯定这是一个简单的修复,但我无法完全弄清楚。

【问题讨论】:

  • 你试过用np.where吗?
  • 这给出了哪个错误?
  • @Nico Albera - ValueError: 要解压的值太多
  • 欢迎来到 StackOverflow!请阅读how to ask a question(尤其是how to create a good example)以获得良好的响应。一个示例 DataFrame 和预期输出将大大有助于回答您的问题。
  • @Alex 添加了示例数据

标签: python pandas


【解决方案1】:

你可以写一个函数

def get_status(df):
    if df['TIME_1'] == df['TIME_MIN']:
        return df['STATUS_1']
    elif df['TIME_2'] == df['TIME_MIN']:
        return df['STATUS_2']
    elif df['TIME_3'] == df['TIME_MIN']:
        return df['STATUS_3']
    elif df['TIME_4'] == df['TIME_MIN']:
        return df['STATUS_4']
    else:
        return df['STATUS_5']

df['STATUS'] = df.apply(get_status, axis = 1)

或者使用非常嵌套的 np.where,

df['STATUS'] = np.where(df['TIME_1'] == df['TIME_MIN'], df['STATUS_1'],\ 
        np.where(df['TIME_2'] == df['TIME_MIN'], df['STATUS_2'],\
        np.where(df['TIME_3'] == df['TIME_MIN'], df['STATUS_3'],\
        np.where(df['TIME_4'] == df['TIME_MIN'], df['STATUS_4'], df['STATUS_5']))))

【讨论】:

  • 谢谢。我有功能选项工作,但希望尽可能创建一些不那么冗长的东西。特别是因为将来可能会有超过 5 个选项。
【解决方案2】:

不是很漂亮,但您可以通过.eq method 使用平等广播。

m = df.iloc[:, :5].eq(df['TIME_MIN'], axis=0)
m.columns = 'STATUS_' + m.columns.str.extract('TIME_(.*)')
df['STATUS'] = df[m].bfill(axis=1).iloc[:, 0]

【讨论】:

    【解决方案3】:

    您可以使用条件和选择

    df = pd.DataFrame([[100,200,150,400,500,'a','b','a','c','a',100], [300,400,200,500,250,'b','b','c','c','c',200]], columns=['TIME_1', 'TIME_2', 'TIME_3', 'TIME_4', 'TIME_5','STATUS_1','STATUS_2','STATUS_3','STATUS_4','STATUS_5','TIME_MIN'])
    
    
    condition= [df['TIME_1'] == df['TIME_MIN'],
                df['TIME_2'] == df['TIME_MIN'],
                df['TIME_3'] == df['TIME_MIN'],
                df['TIME_4'] == df['TIME_MIN'],
                df['TIME_4'] == df['TIME_MIN']]
    
    choice= [df['STATUS_1'],df['STATUS_2'],df['STATUS_3'],df['STATUS_4'],df['STATUS_5']]
    
    df['STATUS'] =np.select(condition,choice,default="")
    
    col_required=['TIME_1','TIME_2','TIME_3','TIME_4','TIME_5','TIME_MIN','STATUS']
    df=df[col_required]
    df
    
    

    输出

        TIME_1  TIME_2  TIME_3  TIME_4  TIME_5  TIME_MIN    STATUS
    0   100 200 150 400 500 100 a
    1   300 400 200 500 250 200 c
    

    【讨论】:

      猜你喜欢
      • 2019-12-15
      • 2013-04-03
      • 2018-09-20
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2021-07-11
      • 2022-01-02
      • 1970-01-01
      相关资源
      最近更新 更多