Мне часто нужно применять '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
Итак, в этих примерах я применяю данные к фрейму данных или серии, и как мне структурировать аргумент?
Спасибо