Как я могу преобразовать функцию Excel, показанную ниже, в код python pandas? - PullRequest
0 голосов
/ 16 марта 2020

У меня есть функция в Excel, как это

=IF(B17="","",MIN(MAX(CEILING((B17-MIN(B$17:B$46))/((MAX(B$17:B$46)-MIN(B$17:B$46))/10),1),1),10))

вход:

Column1 output
512.96  10
307.41  3
413.76  7
323.65  4
376.84  5
368.79  5
367.77  5
345.65  4

Это может быть рассечено следующим образом

ceiling((min-max)/10, 1)
max(ceiling, 1)
min(max,10)

У меня есть код работает до потолка, как показано ниже

def point_10_conversion(new_df):
    g = ((new_df.sub(new_df.min(axis=0))) / ((new_df.max(axis=0)) - (new_df.min(axis=0))))/10
    f = np.around(g.astype(np.double), 3)
    ceil = np.ceil(f)
    print(ceil)

Может кто-нибудь помочь преобразовать эту функцию Excel в pandas или python код? Я использую датафрейм для расчетов.

Заранее спасибо !!

1 Ответ

1 голос
/ 16 марта 2020

Рассмотрите возможность передачи серии Pandas в качестве параметра, чтобы получить серию той же длины, что и формула Excel, запускаемая отдельными ячейками для получения результатов с той же длиной. Затем либо вызовите функцию Python для назначения одного столбца, либо с помощью DataFrame.transform для выбора столбцов или назначения всех столбцов.

def point_10_conversion(ser):
    g = (ser - ser.min()) / ((ser.max() - ser.min())/10)    
    res = pd.Series(np.ceil(g))

    # SERIES APPLY APPROACH (POSSIBLY SLOWER)
    # m_res = res.apply(lambda x: min(max(x, 1), 10))

    # NUMPY ARRAY APPROACH
    m_res = np.minimum(np.maximum(res, 1), 10)

    return m_res


# ASSIGN A SINGLE COLUMN
df['Output'] = point_10_conversion(df['Column1'])

# ASSIGN SELECTED MULTIPLE COLUMNS (BY JOINING DFs)            
df = pd.concat([df, (df.reindex(['Column1', 'Column2', 'Column3'], axis = 'columns')
                       .transform(point_10_conversion)
                       .set_axis(['Col1_Output', 'Col2_Output', 'Col3_Output'], 
                                 axis = 'columns', inplace = False)
                    )],
               axis = 1)    

# REPLACE ALL COLUMNS (ASSUMING ALL INT/FLOAT TYPES)
df = df.transform(point_10_conversion)

Вывод (по сравнению с фактическим выводом формулы Excel, который не соответствует опубликованным номерам OP)

Excel

Excel Output

Python

  • Назначение одного столбца

        Column1  Output
    0   512.96    10.0
    1   307.41     1.0
    2   413.76     6.0
    3   323.65     1.0
    4   376.84     4.0
    5   368.79     3.0
    6   367.77     3.0
    7   345.65     2.0
    
  • Назначение нескольких столбцов (со случайно сгенерированными данными)

    np.random.seed(3162020)
    
    df = pd.DataFrame({'Column1': [512.96, 307.41, 413.76, 323.65, 376.84, 368.79, 367.77, 345.65],
                       'Column2': np.random.uniform(350, 500, 8),
                       'Column3': np.random.uniform(350, 500, 8)})
    
    # ASSIGN SELECTED MULTIPLE COLUMNS  
       Column1     Column2     Column3  Column1  Column2  Column3
    0   512.96  498.143814  465.920589     10.0     10.0      8.0
    1   307.41  405.430558  451.238911      1.0      4.0      7.0
    2   413.76  355.728386  362.713986      6.0      1.0      1.0
    3   323.65  498.231310  363.784559      1.0     10.0      1.0
    4   376.84  488.124593  420.322426      4.0     10.0      5.0
    5   368.79  469.047969  441.922624      3.0      8.0      7.0
    6   367.77  435.742375  492.355799      3.0      6.0     10.0
    7   345.65  474.028331  387.297520      2.0      9.0      2.0
    
    # REPLACE ALL COLUMNS (ASSUMING ALL INT/FLOAT TYPES)
       Column1  Column2  Column3
    0     10.0     10.0      8.0
    1      1.0      4.0      7.0
    2      6.0      1.0      1.0
    3      1.0     10.0      1.0
    4      4.0     10.0      5.0
    5      3.0      8.0      7.0
    6      3.0      6.0     10.0
    7      2.0      9.0      2.0
    

Online Demo (нажмите Выполнить сверху)

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