Я не уверен, что мой набор данных является проприетарным, но я могу упростить. Я имею дело с 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: Списки не обязательно должны быть взаимоисключающими.
Вам нужно: Неясно, что 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
Вы можете просто использовать 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)