создайте новый столбец с тремя условиями, используя np.where - PullRequest
0 голосов
/ 09 октября 2019

как я могу получить три условия в np.where (). обычно он использует только два условия, как я могу получить три. Как и мне нужно создать новый столбец Better_Event, в котором хранятся «Лето», «Зима» или «Оба» на основе сравнения между общим количеством медалей, выигранных в летнем и зимнем соревнованиях (т.е. сравнение между столбцами Total_Summer и Total_Winter), используя «np.where () "function.

data['Better_Events'] = np.where(data['Total_Summer']>data['Total_Winter'],'Summer','Winter')

у приведенного выше кода есть только два выхода. как мне изменить его на три, где, если data ['Total_Summer'] == data ['Total_Winter'] выдает "Both"

Ответы [ 3 ]

3 голосов
/ 09 октября 2019

Вам нужно np.select :

Вот пример:

df=pd.DataFrame({'Total_Summer':[1,2,3,3,6,7],'Total_Winter':[2,2,3,4,5,4]})
print(df)

   Total_Summer  Total_Winter
0             1             2
1             2             2
2             3             3
3             3             4
4             6             5
5             7             4

теперь установите условия и значение для каждого условия:

cond=[df['Total_Summer']>df['Total_Winter'],df['Total_Summer']<df['Total_Winter'],df['Total_Summer'].eq(df['Total_Winter'])]
values=['Summer','Winter','Both']
df['Better_Events']=np.select(cond,values)
print(df)

   Total_Summer  Total_Winter Better_Events
0             1             2        Winter
1             2             2          Both
2             3             3          Both
3             3             4        Winter
4             6             5        Summer
5             7             4        Summer
0 голосов
/ 09 октября 2019

Numpy.select прекрасно работает, однако я хочу представить альтернативное решение, которое должно быть лучше, когда условия более многочисленны или сложны:

# numpy is only used to create the test data
import numpy as np
import pandas as pd

total_summer, total_winter = np.split(np.random.randint(low=0, high=15, size=20), 2)

df = pd.DataFrame(data=zip(total_summer, total_winter), columns=["total_summer", "total_winter"])

def find_better_event(row):
    res : str
    if row["total_summer"] > row["total_winter"]:
        res = "Summer"
    elif row["total_summer"] < row["total_winter"]:
        res = "Winter"
    else:
        res = "Both"
    return res

df["better_events"] = df.apply(find_better_event, axis=1)
0 голосов
/ 09 октября 2019

Вы можете использовать 'apply' с axis = 1:

Total_Summer  Total_Winter
0            74            17
1            75            29
2            48            64
3            77            77
4            16            38

df.apply(lambda r: "Both" if r.Total_Summer==r.Total_Winter else "Summer" if r.Total_Summer>r.Total_Winter else "Winter" ,axis=1) 

Out: 
0    Summer
1    Summer
2    Winter
3      Both
4    Winter
dtype: object

Или вы можете использовать np.where дважды:

np.where( df.Total_Summer.eq(df.Total_Winter),"Both", np.where(df.Total_Summer.gt(df.Total_Winter),"Summer","Winter")) 

Второй метод быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...