Добавить столбцы в кадр данных Pandas с помощью цикла for - PullRequest
2 голосов
/ 02 мая 2019

Блок кода ниже выдает эту таблицу:

       Trial Week   Branch  Num_Dep Tot_dep_amt
       1       1      1       4        4200
       1       1      2       7        9000
       1       1      3       6        4800
       1       1      4       6        5800
       1       1      5       5        3800
       1       1      6       4        3200
       1       1      7       3        1600
       .       .      .       .          .
       .       .      .       .          .
       1       1      8       5        6000
       9       19     40      3        2800

Код:

trials=10
dep_amount=[]
branch=41
total=[]
week=1
week_num=[]
branch_num=[]
dep_num=[]
trial_num=[]
weeks=20

df=pd.DataFrame()

for a in range(1,trials):
    print("Starting trial", a)
    for b in range(1,weeks):
        for c in range(1,branch):
            depnum = int(np.round(np.random.normal(5,2,1)/1)*1)
            acc_dep=0
            for d in range(1,depnum):
                dep_amt=int(np.round(np.random.normal(1200,400,1)/200)*200)
                acc_dep=acc_dep+dep_amt
            temp = pd.DataFrame.from_records([{'Trial': a, 'Week': b, 'branch': c,'Num_Dep': depnum, 'Tot_dep_amt':acc_dep }])
            df = pd.concat([df, temp])
            df = df[['Trial', 'Week', 'branch', 'Num_Dep','Tot_dep_amt']]
            df=df.reset_index()
            df=df.drop('index',axis=1)

Я хотел бы иметь возможность разбивать ветви в цикле for и вместо этого иметь результирующий df, представленный заголовками:

Trial   Week   Branch_1_Num_Dep   Branch_1_Tot_dep_amount   Branch_2_Num_ Dep .....etc

Я знаю, что это можно сделать, сгенерировав DF и выполнив кодирование, но для этой задачи я бы хотел, чтобы он генерировался в цикле for, если это возможно?

1 Ответ

0 голосов
/ 02 мая 2019

Чтобы добиться этого с минимальными изменениями в вашем коде, вы можете сделать что-то вроде следующего:


df = pd.DataFrame()
for a in range(1, trials):
    print("Starting trial", a)
    for b in range(1, weeks):
        records = {'Trial': a, 'Week': b}
        for c in range(1, branch):
            depnum = int(np.round(np.random.normal(5, 2, 1) / 1) * 1)
            acc_dep = 0
            for d in range(1, depnum):
                dep_amt = int(np.round(np.random.normal(1200, 400, 1) / 200) * 200)
                acc_dep = acc_dep + dep_amt

            records['Branch_{}_Num_Dep'.format(c)] = depnum
            records['Branch_{}_Tot_dep_amount'.format(c)] = acc_dep
        temp = pd.DataFrame.from_records([records])
        df = pd.concat([df, temp])
        df = df.reset_index()
        df = df.drop('index', axis=1)

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

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