Python 熊猫数据框中的多个 if else 条件并派生多个列

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/48569166/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 18:45:37  来源:igfitidea点击:

multiple if else conditions in pandas dataframe and derive multiple columns

pythonpandasif-statementdataframe

提问by Kumar AK

I have a dataframe like below.

我有一个如下所示的数据框。

import pandas as pd
import numpy as np
raw_data = {'student':['A','B','C','D','E'],
        'score': [100, 96, 80, 105,156], 
    'height': [7, 4,9,5,3],
    'trigger1' : [84,95,15,78,16],
    'trigger2' : [99,110,30,93,31],
    'trigger3' : [114,125,45,108,46]}

df2 = pd.DataFrame(raw_data, columns = ['student','score', 'height','trigger1','trigger2','trigger3'])

print(df2)

I need to derive Flag column based on multiple conditions.

我需要根据多个条件派生 Flag 列。

i need to compare score and height columns with trigger 1 -3 columns.

我需要将分数和高度列与触发器 1 -3 列进行比较。

Flag Column:

标志栏:

  1. if Score greater than equal trigger 1 and height less than 8 then Red --

  2. if Score greater than equal trigger 2 and height less than 8 then Yellow --

  3. if Score greater than equal trigger 3 and height less than 8 then Orange --

  4. if height greater than 8 then leave it as blank

  1. 如果分数大于等于触发 1 且高度小于 8,则为红色 -

  2. 如果分数大于等于触发器 2 且高度小于 8,则为黄色 -

  3. 如果分数大于等于触发 3 且高度小于 8,则为橙色——

  4. 如果高度大于 8,则将其留空

How to write if else conditions in pandas dataframe and derive columns?

如何在熊猫数据框中编写 if else 条件并派生列?

Expected Output

预期产出

  student  score  height  trigger1  trigger2  trigger3    Flag
0       A    100       7        84        99       114  Yellow
1       B     96       4        95       110       125     Red
2       C     80       9        15        30        45     NaN
3       D    105       5        78        93       108  Yellow
4       E    156       3        16        31        46  Orange

For other column Text1 in my original question i have tired this one but the interger columns not converting the string when concatenation using astype(str) any other approach?

对于我原来的问题中的其他列 Text1 我已经厌倦了这个,但是在使用 astype(str) 任何其他方法连接时,整数列没有转换字符串?

def text_df(df):

    if (df['trigger1'] <= df['score'] < df['trigger2']) and (df['height'] < 8):
        return df['student'] + " score " + df['score'].astype(str) + " greater than " + df['trigger1'].astype(str) + " and less than height 5"
    elif (df['trigger2'] <= df['score'] < df['trigger3']) and (df['height'] < 8):
        return df['student'] + " score " + df['score'].astype(str) + " greater than " + df['trigger2'].astype(str) + " and less than height 5"
    elif (df['trigger3'] <= df['score']) and (df['height'] < 8):
        return df['student'] + " score " + df['score'].astype(str) + " greater than " + df['trigger3'].astype(str) + " and less than height 5"
    elif (df['height'] > 8):
        return np.nan

回答by Vaishali

You need chained comparison using upper and lower bound

您需要使用上限和下限进行链式比较

def flag_df(df):

    if (df['trigger1'] <= df['score'] < df['trigger2']) and (df['height'] < 8):
        return 'Red'
    elif (df['trigger2'] <= df['score'] < df['trigger3']) and (df['height'] < 8):
        return 'Yellow'
    elif (df['trigger3'] <= df['score']) and (df['height'] < 8):
        return 'Orange'
    elif (df['height'] > 8):
        return np.nan

df2['Flag'] = df2.apply(flag_df, axis = 1)

    student score   height  trigger1    trigger2    trigger3    Flag
0   A       100     7       84          99          114         Yellow
1   B       96      4       95          110         125         Red
2   C       80      9       15          30          45          NaN
3   D       105     5       78          93          108         Yellow
4   E       156     3       16          31          46          Orange

Note: You can do this with a very nested np.where but I prefer to apply a function for multiple if-else

注意:你可以用一个非常嵌套的 np.where 来做到这一点,但我更喜欢为多个 if-else 应用一个函数

回答by Esptheitroad Murhabazi

you can use also apply with a custom function on axis 1 like this :

您还可以像这样在轴 1 上使用自定义函数 apply :

def color_selector(x):
    if (x['trigger1'] <= x['score'] < x['trigger2']) and (x['height'] < 8):
        return 'Red'
    elif (x['trigger2'] <= x['score'] < x['trigger3']) and (x['height'] < 8):
        return 'Yellow'
    elif (x['trigger3'] <= x['score']) and (x['height'] < 8):
        return 'Orange'
    elif (x['height'] > 8):
        return ''
df2 = df2.assign(flag=df2.apply(color_selector, axis=1))

you will get something like this : enter image description here

你会得到这样的东西: 在此处输入图片说明