Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将下面显示的excel函数转换为python代码?_Python_Excel_Pandas_Numpy - Fatal编程技术网

如何将下面显示的excel函数转换为python代码?

如何将下面显示的excel函数转换为python代码?,python,excel,pandas,numpy,Python,Excel,Pandas,Numpy,我在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)

我在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代码吗?我使用dataframe进行计算


提前谢谢你

考虑将Pandas系列作为参数传入,以返回与单个单元格运行Excel公式相同长度的系列,以返回相同长度的结果。然后调用Python函数进行单列分配,或者调用with进行选择列或所有列分配

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

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
    
  • 分配多个列(使用随机生成的数据)


(单击顶部的Run)

有一种方法可以翻译问题中提到的函数,而不必自己编写Python

PyCel、Formulas、xlcalculator和Koala等库使用AST将Excel公式转换为Python

我是xlcalculator的项目所有者,因此我将在演示中使用该库。也就是说,其他图书馆很有能力完成这项特殊任务。每个图书馆都有不同的遗产,因此它们有不同的优势

通常,上述库读取Excel文件,将公式转换为Python,然后提供评估功能。Xlcalculator还可以解析一个特制的dict,这正是我在这里利用的优势

从xlcalculator导入模型编译器
从xlcalculator导入模型
从xlcalculator导入计算器
输入命令={
“Sheet1!B16”:“Column1”,
“Sheet1!B17”:512.96,
“Sheet1!B18”:307.41,
“Sheet1!B19”:413.76,
“Sheet1!B20”:323.65,
“Sheet1!B21”:376.84,
“Sheet1!B22”:368.79,
“Sheet1!B23”:367.77,
“Sheet1!B24”:345.65,
“Sheet1!C16”:“操作结果”,
“Sheet1!C17”:10,
“Sheet1!C18”:3,
“Sheet1!C19”:7,
“Sheet1!C20”:4,
“Sheet1!C21”:5,
“Sheet1!C22”:5,
“Sheet1!C23”:5,
“Sheet1!C24”:4,
“Sheet1!D16”:“实际产量(冻糕)”,
“Sheet1!D17”:“=如果(B17=”“,”,最小值(最大值(上限)(B17-MIN(17:46))/(最大值(17:46)-最小值(17:46))/10),1),1),10”),
“Sheet1!D18”:“=如果(B18=”“,”,最小值(最大值(上限)(B18-MIN(B$17:B$46))/(最大值(B$17:B$46)-最小值(B$17:B$46))/10),1),1),10”),
“Sheet1!D19”:“=如果(B19=”“,”,最小值(最大值(上限)(B19-MIN(B$17:B$46))/(最大值(B$17:B$46)-最小值(B$17:B$46))/10),1),1),10”),
“Sheet1!D20”:“=如果(B20=”“,”,最小值(最大值(上限)(B20-MIN(17:46元))/(最大值(17:46元)-最小值(17:46元))/10),1),1),10”),
“Sheet1!D21”:“=如果(B21=”“,”,最小值(最大值(上限)(B21-MIN(17:46元))/(最大值(17:46元)-最小值(17:46元))/10),1),1),10”),
“Sheet1!D22”:“=如果(B22=”“,”,最小值(最大值(上限)(B22-MIN(17:46元))/(最大值(17:46元)-最小值(17:46元))/10),1),1),10”),
“Sheet1!D23”:“=如果(B23=”“,”,最小值(最大值(上限)(B23-MIN(17:46元))/(最大值(17:46元)-最小值(17:46元))/10),1),1),10”),
“Sheet1!D24”:“=如果(B24=”“,”,最小值(最大值(上限)(B24-MIN(B$17:B$46))/(最大值(B$17:B$46)-最小值(B$17:B$46))/10),1),1),10”)”
}
编译器=模型编译器()
my_model=compiler.read_和parse_dict(输入_dict)
evaluator=evaluator(我的_模型)
打印(evaluator.evaluate(“Sheet1!C16”))
打印(“Sheet1!C17”,evaluator.evaluate(“Sheet1!C17”))
打印(“Sheet1!C18”,evaluator.evaluate(“Sheet1!C18”))
打印(“Sheet1!C19”,evaluator.evaluate(“Sheet1!C19”))
打印(“Sheet1!C20”,evaluator.evaluate(“Sheet1!C20”))
打印(“Sheet1!C21”,evaluator.evaluate(“Sheet1!C21”))
打印(“Sheet1!C22”,evaluator.evaluate(“Sheet1!C22”))
打印(“Sheet1!C23”,evaluator.evaluate(“Sheet1!C23”))
打印(“Sheet1!C24”,evaluator.evaluate(“Sheet1!C24”))
打印()
打印(evaluator.evaluate(“Sheet1!D16”))
打印(“Sheet1!D17”,evaluator.evaluate(“Sheet1!D17”))
打印(“Sheet1!D18”,evaluator.evaluate(“Sheet1!D18”))
打印(“Sheet1!D19”,evaluator.evaluate(“Sheet1!D19”))
打印(“Sheet1!D20”,evaluator.evaluate(“Sheet1!D20”))
打印(“Sheet1!D21”,evaluator.evaluate(“Sheet1!D21”))
打印(“Sheet1!D22”,evaluator.evaluate(“Sheet1!D22”))
打印(“Sheet1!D23”,evaluator.evaluate(“Sheet1!D23”))
打印(“Sheet1!D24”,evaluator.evaluate(“Sheet1!D24”))

请与预期的ouptut@sammywemmy分享一些数据,我已经更新了问题的答案likewise@dumb_coder你能不能把它作为文本放在一个代码块中,以及与该输入相关联的输出?这样人们就可以复制/粘贴到他们的解释器中,在解释器上进行实际的尝试…谢谢,什么是
B$17:B$46
-我们这里有所有必要的信息来实际计算这里给出的
column1
输出吗?(如果输出的是一个值,或者显示一个
column2
列,显示值应该是什么,这将非常方便。)
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
>python stackoverflow.py
OP results
Sheet1!C17 10
Sheet1!C18 3
Sheet1!C19 7
Sheet1!C20 4
Sheet1!C21 5
Sheet1!C22 5
Sheet1!C23 5
Sheet1!C24 4

Actual Output (Parfait)
Sheet1!D17 10.0
Sheet1!D18 1
Sheet1!D19 6.0
Sheet1!D20 1.0
Sheet1!D21 4.0
Sheet1!D22 3.0
Sheet1!D23 3.0
Sheet1!D24 2.0