Как выбрать одно значение из нескольких столбцов? - PullRequest
0 голосов
/ 19 февраля 2019

Мне нужно разумно объединить значения трех столбцов в кадре данных, как показано ниже.Код должен выбрать прогноз первого типа, который является True, только первый, даже если другой последующий прогноз также True.Если ни одно из предсказаний не является True, возвращаемое значение должно быть NaN.

index    name       t1        t1_check  t2       t2_check  t3       t3_check
----------------------------------------------------------------------------
0        cow        animal    True      phone    False     fruit    False
1        apple      animal    False     fruit    True      food     True
2        carrot     vehicle   False     veg      True      animal   False
3        dog        pet       True      animal   True      object   False
4        horse      window    False     object   False     animal   True
5        car        pet       False     food     False     fruit    False

Вот что я попробовал:

Сначала я объединил два связанных столбца и отбросилстарые.

In:
df['t1_comb'] = str(df['t1']) + str(df['t1_check'])
df['t2_comb'] = str(df['t2']) + str(df['t2_check'])
df['t3_comb'] = str(df['t3']) + str(df['t3_check'])

df.drop(columns=['t1', 't1_check', 't2', 't2_check', 't3', 't3_check'], inplace=True)

Out:
index    name       t1_comb         t2_comb        t3_comb
---------------------------------------------------------------
0        cow        animalTrue      phoneFalse     fruitFalse
1        apple      animalFalse     fruitTrue      foodTrue
2        carrot     vehicleFalse    vegTrue        animalFalse
3        dog        petTrue         animalTrue     objectFalse
4        horse      windowFalse     objectFalse    animalTrue
5        car        petFalse        foodFalse      fruitFalse

Затем я попытался заменить все записи, содержащие False на NaN, и удалить строку True из каждой записи.

In:
df.loc[df['t1_comb'].str.contains('False'), 't1_comb'] = np.nan
df.loc[df['t2_comb'].str.contains('False'), 't2_comb'] = np.nan
df.loc[df['t3_comb'].str.contains('False'), 't3_comb'] = np.nan

df.t1_comb = df.t1_comb.str.replace('True', '')
df.t2_comb = df.t2_comb.str.replace('True', '')
df.t3_comb = df.t3_comb.str.replace('True', '')

Out:
index    name       t1_comb         t2_comb        t3_comb
---------------------------------------------------------------
0        cow        animal          NaN            NaN
1        apple      NaN             fruit          food
2        carrot     NaN             veg            NaN
3        dog        pet             animal         NaN
4        horse      NaN             NaN            animal
5        car        NaN             NaN            NaN

следующий шаг - где у меня возникают некоторые трудности, часть, где рассматривается только первое значение.

Нужный результат должен выглядеть примерно так:

index    name       type
----------------------------
0        cow        animal
1        apple      fruit
2        carrot     veg
3        dog        pet
4        horse      animal
5        car        NaN

1 Ответ

0 голосов
/ 19 февраля 2019

Я уверен, что лучшее решение возможно, но вы можете использовать apply для каждой строки

def myfunc(row):
    if row['t1_check']:
        return row['t1']
    elif row['t2_check']:
        return row['t2']
    elif row['t3_check']:
        return row['t3']
    return np.nan

df['type']=df.apply(myfunc,axis=1)
df[['name','type']]

Выход

index    name       type
----------------------------
0        cow        animal
1        apple      fruit
2        carrot     veg
3        dog        pet
4        horse      animal
5        car        NaN
...