Python Pandas обновление столбцов с одинаковыми именами, а также выполнение других вычислений в цикле - PullRequest
0 голосов
/ 17 июня 2020

В кадре данных я хочу перебирать столбцы с одинаковыми именами и во время итерации, когда их сумма превышает значение «val_n». Я хочу 4 вещи: 1) превосходит когда (на какой итерации он превышает значение "val_n") 2) sum_col (сумма столбцов с одинаковыми именами) 3) В точке превышения когда я хочу заменить соответствующее значение столбца как (col - (sum_col - val_n) 4) И после точки превышения_when я хочу заменить оставшееся значение cols на 0.

Dataframe выглядит так:

id  col1    col2    col3    col4    col5    col6    col7    col8    col9    col10   col11   col12   col13   col14   val_n
1   350 350 350 350 350 350 350 350 350 350 0   0   0   0   3105.61
2   50  50  55  105 50  0   50  100 50  50  50  50  1025    1066.86 3185.6
3   0   0   0   0   0   3495.1  0   0   0   0   0   0   0   3495.1  3477.76

Требуемый Dataframe:

id  col1    col2    col3    col4    col5    col6    col7    col8    col9    col10   col11   col12   col13   col14   val_n   exceed_when sum_col
1   350 350 350 350 350 350 350 350 305.61  0   0   0   0   0   3105.61 9   3500
2   50  50  55  105 50  0   50  100 50  50  50  50  1025    1066.86 3185.6      2751.86
3   0   0   0   0   0   3477.76 0   0   0   0   0   0   0   0   3477.76 6   6990.2

Это то, что я пробовал:

def trans(row):
    row['sum_col'] = 0
    row['exceed_ind'] = 0

    for i in range(1, 15):
        row['sum_col'] += row['col' + str(i)]

        if ((row['exceed_ind'] == 0) &
            (row['sum_col'] >= row['val_n'])):

            row['exceed_ind'] = 1
            row['exceed_when'] = i

        else:
            continue

        if row['exceed_when'] == i:
            row['col' + str(i)] = (
                row['col' + str(i)] - (
                    row['sum_col'] - row['val_n']))

        elif row['exceed_when'] < i:
            row['col' + str(i)] = 0

        else:
            row['col' + str(i)] = row['col' + str(i)]
    return row

df1 = df.apply(trans, axis=1)

Я получаю правильные результаты для sum_col, превышайте, когда, но условия elif row ['excel_when'] DDL для генерации DataFrame:

import pandas as pd

df = pd.DataFrame({'id': [1, 2, 3],
                   'col1': [350, 50, 0],
                   'col2': [350, 50, 0],
                   'col3': [350, 55, 0],
                   'col4': [350, 105, 0],
                   'col5' : [350, 50, 0],
                   'col6': [350, 0, 3495.1],
                   'col7': [350, 50, 0],
                   'col8': [350, 100, 0],
                   'col9': [350, 50, 0],
                   'col10': [350, 50, 0],
                   'col11': [0, 50, 0],
                   'col12': [0, 50, 0],
                   'col13': [0, 1025, 0],
                   'col14': [0, 1066.86, 3495.1],
                   'val_n': [3105.61, 3185.6, 3477.76]
                   })

Спасибо!

1 Ответ

1 голос
/ 18 июня 2020

Насколько мне известно, функция .apply будет передавать только копию row, и все обновления происходят только с копией, а не с оригиналом DataFrame. В этом случае вам нужно пройти l oop по строкам и обновить их с помощью индекса.

df['sum_col'] = 0
df['exceed_ind'] = 0
df['exceed_when'] = 0

for idx, row in df.iterrows():
    sum_col = 0
    exceed_ind = 0
    exceed_when = 0

    for i in range(1, 15):
        sum_col += row['col' + str(i)]

        if ((exceed_ind == 0) &
            (sum_col >= row['val_n'])):

            exceed_ind = 1
            exceed_when = i
            df.loc[idx, 'exceed_ind'] = exceed_ind
            df.loc[idx, 'exceed_when'] = exceed_when
            df.loc[idx, 'col' + str(i)] = (row['col' + str(i)] - (sum_col - row['val_n']))

        elif (exceed_ind==1) & (exceed_when < i):
            df.loc[idx, 'col' + str(i)] = 0

        df.loc[idx, 'sum_col'] = sum_col

print(df)

Результат:

    col1  col2  col3  col4  col5     col6  col7  col8    col9  col10  col11  \
id                                                                            
1    350   350   350   350   350   350.00   350   350  305.61      0      0   
2     50    50    55   105    50     0.00    50   100   50.00     50     50   
3      0     0     0     0     0  3477.76     0     0    0.00      0      0   

    col12  col13    col14    val_n  sum_col  exceed_ind  exceed_when  
id                                                                    
1       0      0     0.00  3105.61  3500.00           1            9  
2      50   1025  1066.86  3185.60  2751.86           0            0  
3       0      0     0.00  3477.76  6990.20           1            6  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...