График платежей на основе условий

#python #pandas #numpy

Вопрос:

 names = ['john', 'pete', 'jack']
funds = [1000, 3600, 2390]

df = pd.DataFrame({'Name': names, 'Fund': funds})

df['m1'] = np.nan
df['m2'] = np.nan
df['m3'] = np.nan
df['m4'] = np.nan
df['m5'] = np.nan
df['m6'] = np.nan
df['m7'] = np.nan
df['m8'] = np.nan
df['m9'] = np.nan
df['m10'] = np.nan
df['m11'] = np.nan
df['m12'] = np.nan
 

оригинальный df

    Name  Fund  m1   m2   m3   m4   m5   m6   m7   m8   m9  m10  m11  m12  
0  john  1000 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN                           
1  pete  3600 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN       
2  jack  2390 NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 

Воссозданная df структура представляет собой структуру типичного csv — файла, который я получаю. Я должен заполнить на основе набора «условий выпуска фонда», которые варьируются от таблицы csv к следующей.

Ниже я привел пример набора «условий выпуска фонда», для которого я хотел бы создать сценарий, который я могу легко адаптировать при изменении условий.

Обнародование условий фонда

джон 10% от фонда ежемесячно в течение 10 месяцев, начиная с m1

пит 12,5% от фонда ежемесячно в течение 8 месяцев, начиная с м2

джек 20% от фонда ежемесячно в течение 5 месяцев, начиная с m4

Я хочу иметь возможность применять условия выпуска фонда в качестве кода для получения результатов, показанных ниже:

Желаемый Результат

    Name  Fund  m1   m2   m3   m4   m5   m6   m7   m8   m9  m10  m11  m12  
0  john  1000 NaN  100  100  100  100  100  100  100  100  100  100  NaN                           
1  pete  3600 NaN  NaN  450  450  450  450  450  450  450  450  NaN  NaN       
2  jack  2390 NaN  NaN  NaN  NaN  478  478  478  478  478  NaN  NaN  NaN                         
 

Я думаю, что, возможно, потребуется кортеж или словарь, но, честно говоря, я не знаю, как решить эту задачу.

Заранее большое спасибо

Комментарии:

1. Так что же на самом деле вы хотите сделать?

2. Я ищу помощи в написании кода, который будет повторять логику «освобождение условий фонда» и выводит окончательный df, как показано на рисунке

3. Это всего лишь шаблон решения проблемы, а не сценарий реальной проблемы. Вам просто нужно прочитать схему. Подсказка: Посмотрите идентификатор и индексы столбцов и создайте отношение, и значения будут просто (средства/нет месяцев) в соответствии с шаблоном, который вы также можете рассчитать, используя созданное вами отношение.

Ответ №1:

Вы можете попробовать этот фрагмент в качестве отправной точки —

 # target columns range for each Name 
cols = list(df.columns)
john = cols[cols.index('m2'):cols.index('m2') 10]
pete = cols[cols.index('m3'):cols.index('m3') 8]
jack = cols[cols.index('m5'):cols.index('m5') 5]

# Calculate funds for each Name and distribute in the targeted columns
df.loc[df.Name=='john', john] = [df[df.Name=='john'].iloc[0].Fund*0.1] * len(john)
df.loc[df.Name=='pete', pete] = [df[df.Name=='pete'].iloc[0].Fund*0.125] * len(pete)
df.loc[df.Name=='jack', jack] = [df[df.Name=='jack'].iloc[0].Fund*0.20] * len(jack)
 

Это базовая pandas логика индексатора строк и индексатора столбцов для назначения списка значений. Первый раздел фрагмента предназначен для имен столбцов в соответствии с вашей логикой. Например, целевые имена столбцов для джона начинаются с m2 и продолжаются в течение следующих 10 месяцев.

cols[cols.index('m2'):cols.index('m2') 10] возвращает эти списки столбцов, где 10 указано количество следующих месяцев. Этот список столбцов использовался для назначения столбцов df для john обновления значений.

Та же логика была применена и к другим Name s.

Комментарии:

1. Да, я попробовал немного поменять местами условия и использовать переменные для целевых столбцов, и в первый раз это отлично работает. огромное вам спасибо