Создание нового столбца, который может равняться одному из многих столбцов в зависимости от условия (Панды) - PullRequest
1 голос
/ 06 ноября 2019

У меня есть широкий массив данных pandas с несколькими переменными с названиями вида «crimeYR». Например, crime1996 - это фиктивная переменная, которая сообщает мне, было ли наблюдение за преступлением до 1996 года, преступление 1998 года говорит мне, был ли он / она осужден за преступление до 1998 года, и так далее. Все в наборе данных рождаются в разные годы, и я хотел бы создать одну переменную, которая сообщает мне, совершил ли человек преступление в возрасте 25 лет. Вот пример того, что я хотел бы создать

birthYR  crime2006 crime2008 crime2010 crimeby25
1981         0         1         1         0
1981         1         1         1         1
1983         0         1         1         1
1982         0         0         1         0

У меня есть общее представление о том, как можно кодировать его в stata, но я изо всех сил пытаюсь заставить его работать в python. Вот идея того, как это может работать в stata:

gen crimeby25 = 0
foreach v of num 2006/2016{
     replace crimeby25 = crime`v' if `v' - birthyr == 25
}

Какой простой способ сделать то, что я пытаюсь сделать в Python?

1 Ответ

1 голос
/ 06 ноября 2019

Вот решение. У вас есть следующий фрейм данных:

df = pd.DataFrame({'birthYR': [1981,1981,1983,1982],
                   'crime2006': [0,1,0,0],
                   'crime2008': [1,1,1,0],
                   'crime2010':[1,1,1,1]})

df

birthYR  crime2006 crime2008 crime2010 crimeby25
1981         0         1         1         0
1981         1         1         1         1
1983         0         1         1         1
1982         0         0         1         0

Давайте сначала определим список лет, которые мы изучаем:

years = [2006,2008,2010]

Мы создаем несколько промежуточных полезных столбцов

for year in years :
    # Compute the age at a given year
    df["AgeIn"+str(year)] = year - df["birthYR"]

    # Is he/she more than 25 at a given year
    df["NotMoreThan25In"+str(year)] = df["AgeIn"+str(year)]<=25

    # Let's remove age column for clarity
    df = df.drop("AgeIn"+str(year),axis=1)

    # Check if he/she commited crime and was not more than 25 at a given year
    df["NotMoreThan25In"+str(year)+"AndCrime"] = df["NotMoreThan25In"+str(year)]*df["crime"+str(year)]

В конце мы просто суммируем общее количество за каждый год, чтобы увидеть, совершил ли он / она преступление, к 25:

df["crimeby25"] = df[["Not25In"+str(year)+"AndCrime" for year in years]].max(axis=1)

df["crimeby25"]

0    0
1    1
2    1
3    0
...