根据多种条件在熊猫中创建新列

时间:2020-09-01 03:39:08

标签: pandas loops

我想根据各种条件创建一个新列

假设我有一个df,其中A列可以等于以下任意值:['Single','Multiple','Commercial','Domestic','Other'],B列的数值介于0到30之间

如果A ='Single'或'Multiple',我试图使C列为'中等',并且如果它等于其他任何值,则考虑B列中的值。如果A列!='Single'或“多个”,如果3 19,则C列将为中等;如果B> = 19,则C列将为“高”。

我尝试了各种循环组合,但似乎无法理解。有帮助吗?

trial = []
for x in df['A']: 
    if x == 'Single' or x == 'Multiple':
        trial.append('Moderate') 
    elif x != 'Single' or x != 'Multiple':
        if df['B']>19:
                trial.append('Test') 


df['trials'] = trial

谢谢你

Denisse

1 个答案:

答案 0 :(得分:0)

如果您提供一些示例数据,那将会很好。但是,通过我创建的一些代码,您可以看到如何将函数应用到您的DataFrame的每一行。

数据

valuesA = ['Single', 'Multiple', 'Commercial', 'Domestic', 'Other',
           'Single', 'Multiple', 'Commercial', 'Domestic', 'Other']
valuesB = [0, 10, 20, 25, 30, 25, 15, 10, 5, 3 ]

df  = pd.DataFrame({'A': valuesA, 'B': valuesB})
|    | A          |   B |
|---:|:-----------|----:|
|  0 | Single     |   0 |
|  1 | Multiple   |  10 |
|  2 | Commercial |  20 |
|  3 | Domestic   |  25 |
|  4 | Other      |  30 |
|  5 | Single     |  25 |
|  6 | Multiple   |  15 |
|  7 | Commercial |  10 |
|  8 | Domestic   |   5 |
|  9 | Other      |   3 |

要应用的功能

您没有指定如果B列小于或等于3会发生什么,因此我假设C将为'Low'。根据需要调整功能。另外,也许您的问题中有一个错字,当您说“ 3 19”时,我改为了“ 3

def my_function(x):
    if x['A'] in ['Single', 'Multiple']:
        return 'Moderate'
    else:
        if x['B'] <= 3:
            return 'Low'
        elif 3 < x['B'] < 19:
            return 'Moderate'
        else:
            return 'High'

新列

有了DataFrame和新功能,您可以使用使用参数'axis = 1'的apply方法将其应用于每一行:

df['C'] = df.apply(my_function, axis=1)
|    | A          |   B | C        |
|---:|:-----------|----:|:---------|
|  0 | Single     |   0 | Moderate |
|  1 | Multiple   |  10 | Moderate |
|  2 | Commercial |  20 | High     |
|  3 | Domestic   |  25 | High     |
|  4 | Other      |  30 | High     |
|  5 | Single     |  25 | Moderate |
|  6 | Multiple   |  15 | Moderate |
|  7 | Commercial |  10 | Moderate |
|  8 | Domestic   |   5 | Moderate |
|  9 | Other      |   3 | Low      |