Как добавить булевую серию в python DataFrame на основе другой серии в упомянутом DataFrame?

[D0] SO. Долгое время, первый раз.

Я не уверен, что мой набор данных является проприетарным, но я могу упростить. Я имею дело с DataFrame, который включает состояния, и мне были предоставлены некоторые списки, содержащие информацию об этих состояниях.

         Name   Value1    Value2
0     Alabama      7.4       4.4
1    Delaware      6.4       4.4
2        Ohio      2.4       2.0
3    Virginia      1.4       1.2

Но тогда мне даются некоторые списки. Предположим, что это списки состояний, в которых в то время были лошади, которые были мэрами.

horse_mayor_yes = ['Alabama', 'Delaware']
horse_mayor_no  = ['Ohio', 'Virginia']

Результат, который я хочу:

         Name   Value1    Value2    Horse    Horseless
0     Alabama      7.4       4.4        1            0
1    Delaware      6.4       4.4        1            0
2        Ohio      2.4       2.0        0            1
3    Virginia      1.4       1.2        0            1

Я знаю, что могу создавать списки 1 и 0, но я хочу что-то, что я могу увеличить в ситуациях, например, сотнями названных элементов, если мне дадут новые неупорядоченные списки (при условии уникальных имен).

Спасибо!

e1: Спасибо, пользователь, за исправление моих опечаток. e2: Списки не обязательно должны быть взаимоисключающими.

0
задан 13 August 2018 в 15:59

2 ответа

Вам нужно: Неясно, что horse и horseless могут одновременно быть истинными одновременно.

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'Name':['Alabama','Deleware','Ohio','Virginia'],
                    'value1':[1,2,3,4], 'value2':[5,6,7,8]})


horse_mayor_yes = ['Alabama', 'Deleware']
horse_mayor_no  = ['Ohio', 'Virginia']

df['Horse'] = np.where(df['Name'].isin(horse_mayor_yes), 1, 0)
df['Horseless'] = np.where(df['Name'].isin(horse_mayor_no), 1, 0)

print(df)

Выход:

       Name  value1  value2  Horse  Horseless
0   Alabama       1       5      1          0
1  Deleware       2       6      1          0
2      Ohio       3       7      0          1
3  Virginia       4       8      0          1
0
ответ дан 15 August 2018 в 17:01
  • 1
    Да, они могут быть. Я исправлю это. Спасибо. – Samuel Adjacent 13 August 2018 в 15:56
  • 2
    В этом случае мой ответ будет отлично работать в вашем случае. – Akshay Nevrekar 13 August 2018 в 15:58

Вы можете просто использовать isin():

df["Horse"] = df.Name.isin(horse_mayor_yes)
df["Horseless"] = ~df.Horse

df
       Name  Value1  Value2  Horse Horseless
0   Alabama     7.4     4.4   True     False
1  Delaware     6.4     4.4   True     False
2      Ohio     2.4     2.0  False      True
3  Virginia     1.4     1.2  False      True

Если вам нужно преобразовать bool в int, используйте:

df[["Horse", "Horseless"]] = df[["Horse", "Horseless"]].astype(int)
2
ответ дан 15 August 2018 в 17:01

Другие вопросы по тегам:

Похожие вопросы: