#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. Да, я попробовал немного поменять местами условия и использовать переменные для целевых столбцов, и в первый раз это отлично работает. огромное вам спасибо