Создание функции, которая может перебирать строки и извлекать из разных столбцов - PullRequest
0 голосов
/ 11 сентября 2018

Фрейм данных немного проще, чем то, с чем я работаю, но я пытаюсь написать функцию, которая будет рассматривать три разных бюджета, в которых у нас есть средства.У нас есть ежедневная норма расходов, которая является неизменной, независимо от бюджета, но мы рассчитываем извлечь из первого бюджета первый, второй второй и т. Д. Я начал писать функцию, но уже столкнулся с проблемами, не вдаваясь в большие сложности,Функция, которую я пытаюсь создать, уменьшит соответствующий бюджет на все потраченное и вернет соответствующее значение в столбце «потрачено».Если потраченная сумма превышает бюджет, он будет извлекаться из второго бюджета (а затем и третьего), уменьшая каждый соответственно.

import pandas as pd
import matplotlib.pyplot as plt

ID = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Budget_1 = [1000, 1200, 1300, 100 ,500, 0, 800, 950, 4321, 800, 1000, 1200, 1300, 100 ,500, 0, 800, 950, 4321, 800]
Budget_2 = [1000, 1200, 1300, 100 ,500, 0, 800, 950, 4321, 800, 1000, 1200, 1300, 100 ,500, 0, 800, 950, 4321, 800]
Budget_3 = [1000, 1200, 1300, 100 ,500, 0, 800, 950, 4321, 800, 1000, 1200, 1300, 100 ,500, 0, 800, 950, 4321, 800]
FY = [2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019]
Days = [250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250]
spend = [2.5, 3.0, 4.0, 5.0, 4.0, 10.0, 2.5, 2.0, 4.0, 2.5, 2.5, 3.0, 4.0, 5.0, 4.0, 10.0, 2.5, 2.0, 4.0, 2.5]
Spent_1 = ''
Spent_2 = ''
Spent_3 = ''
Total_Spent = ''
d = {'ID': ID, 'Budget 1': Budget_1, 'Budget 2': Budget_2, 'Budget 3': Budget_3, 'Fiscal Year': FY, 'Days': Days, 'Spent 1': Spent_1, 'Spent 2': Spent_2, 'Spent 3': Spent_3, 'Total Spent': Total_Spent, 'Spend Rate': spend}
df = pd.DataFrame(d)

print(df)

df = df.sort_values(['Fiscal Year', 'ID'], ascending = True)

def funded_calc(spendrate):
    spent1 = spendrate*df['Days']
    df['Spent 1'] = df['Spent 1'] - spent1
    return spent1

df['Spent'] = df['Spend Rate'].apply(funded_calc)

print(df)

1 Ответ

0 голосов
/ 11 сентября 2018

Попробуйте это:

def funded_calc(df):
    s = 0
    df['Spent 1'] = df['Budget 1'] - df['Spend Rate']*df['Days']
    if df['Spent 1'] < 0:
        s = df['Spent 1']
        df['Spent 1'] = 0
    df['Spent 2'] = df['Budget 2'] - df['Spend Rate']*df['Days'] + s
    if df['Spent 2'] < 0:
        s = df['Spent 2']
        df['Spent 2'] = 0
    df['Spent 3'] = df['Budget 3'] - df['Spend Rate']*df['Days'] + s
    df['Total Spent'] = sum([df['Spent 1'], df['Spent 2'], df['Spent 3']])
    return df

df.apply(funded_calc, axis=1)

Выход:

    Budget 1  Budget 2  Budget 3  Days  Fiscal Year  ID  Spend Rate  Spent 1  \
0       1000      1000      1000   250         2018   1         2.5    375.0   
1       1200      1200      1200   250         2018   2         3.0    450.0   
2       1300      1300      1300   250         2018   3         4.0    300.0   
3        100       100       100   250         2018   4         5.0      0.0   
4        500       500       500   250         2018   5         4.0      0.0   
5          0         0         0   250         2018   6        10.0      0.0   
6        800       800       800   250         2018   7         2.5    175.0   
7        950       950       950   250         2018   8         2.0    450.0   
8       4321      4321      4321   250         2018   9         4.0   3321.0   
9        800       800       800   250         2018  10         2.5    175.0   
10      1000      1000      1000   250         2019   1         2.5    375.0   
11      1200      1200      1200   250         2019   2         3.0    450.0   
12      1300      1300      1300   250         2019   3         4.0    300.0   
13       100       100       100   250         2019   4         5.0      0.0   
14       500       500       500   250         2019   5         4.0      0.0   
15         0         0         0   250         2019   6        10.0      0.0   
16       800       800       800   250         2019   7         2.5    175.0   
17       950       950       950   250         2019   8         2.0    450.0   
18      4321      4321      4321   250         2019   9         4.0   3321.0   
19       800       800       800   250         2019  10         2.5    175.0   

    Spent 2  Spent 3  Total Spent  
0     375.0    375.0       1125.0  
1     450.0    450.0       1350.0  
2     300.0    300.0        900.0  
3       0.0  -3450.0      -3450.0  
4       0.0  -1500.0      -1500.0  
5       0.0  -7500.0      -7500.0  
6     175.0    175.0        525.0  
7     450.0    450.0       1350.0  
8    3321.0   3321.0       9963.0  
9     175.0    175.0        525.0  
10    375.0    375.0       1125.0  
11    450.0    450.0       1350.0  
12    300.0    300.0        900.0  
13      0.0  -3450.0      -3450.0  
14      0.0  -1500.0      -1500.0  
15      0.0  -7500.0      -7500.0  
16    175.0    175.0        525.0  
17    450.0    450.0       1350.0  
18   3321.0   3321.0       9963.0  
19    175.0    175.0        525.0 

Это то, что вы хотите?

Я использую применить для каждого сырья.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...