Как использовать функцию для каждой строки кадра данных - .apply? .map .mask? - PullRequest
0 голосов
/ 22 апреля 2020

Мне часто нужно применять 'by row' logi c к фрейму данных, и, хотя у меня может быть функция для этого, я не уверен, как применить его к фрейму данных, а не полагаться на a для l oop.

Приведенный ниже код работает, но кажется, что это не лучший способ сделать это. Я пытался поместить его в функции и использовать лямбда, .apply и .map, но что бы я ни делал, я не собираю это правильно. Я попытался прочитать об этом, но не могу понять, пытаюсь ли я применить к кадру данных, серии, поэлементно и т. Д. c в реальном примере, как показано ниже.

Например, посмотрите на эти фиктивные данные:

import pandas as pd
import numpy as np
import datetime
import random

example = pd.DataFrame({'Total Completions(2015)': [0,0,0,5,10,0],
                      'Total Completions(2016)': [0,1,4,0,18,0],
                      'Total Completions(2017)': [2,1,6,5,0,15],
                      'Total Completions(2018)': [0,0,8,5,0,1]})

Что я хочу сделать, это найти первый год, в котором есть завершения (> 0). Первый бит кода определяет, какие столбцы являются общими столбцами, и выбирает соответствующий год из скобок. Затем он находит, какой из этих возможных лет является самым ранним из всех завершений в нем (> 0), и использует его как минимальный год, в котором можно выполнить следующую часть - назначить случайную дату в этом финансовом году.

# initiates the columns i want to populate to start
example['min_yr'] = 0
example['Dummy Date'] = ''

# gets the first year where completions begin

for row in example.index:
    min_yr = 0
    for header in example.columns:
        # if it's one of the total columns
        if header[:5] == 'Total':
            # get the year as an integer from the brackets in the header
            get_yr = int(header[18:-1])
            # if it's the first year with completions it comes across, that year is first minimum
            if min_yr == 0 and example[header][row] > 0:
                min_yr = get_yr
            # if there is already a min year but there is a new year with an entry that's earlier
            # replace with the new minimum year
            elif min_yr > 0 and example[header][row] > 0 and get_yr < min_yr:
                min_yr = get_yr
    example['min_yr'][row] = min_yr

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

for row in example.index:
    start_date = datetime.date((example['min_yr'][row] -1), 4, 1)
    end_date = datetime.date(example['min_yr'][row], 3, 31)

    time_between_dates = end_date - start_date
    days_between_dates = time_between_dates.days
    random_number_of_days = random.randrange(days_between_dates)
    random_date = start_date + datetime.timedelta(days=random_number_of_days)
    example['Dummy Date'][row] = random_date

Итак, в этих примерах я применяю данные к фрейму данных или серии, и как мне структурировать аргумент?

Спасибо

...