评估Pandas的价值观

2024-04-19 12:55:41 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这样一个数据帧

   20            28      25     19     2     4             22
E   4  =E19*E20*E22  =E2*E4  0.001   860  0.80  =SUM(D22:D28)
D   4  =D19*D20*D22  =D2*D4  0.001   880  0.80  =SUM(C22:C28)
C   3  =C19*C20*C22  =C2*C4  0.001   900  0.90  =SUM(B22:B28)
F   3  =F19*F20*F22  =F2*F4  0.001   840  0.70  =SUM(E22:E28)
B   4  =B19*B20*B22  =B2*B4  0.001  1000  0.95              0
G   4  =G19*G20*G22  =G2*G4  0.002   800  0.60  =SUM(F22:F28)

我需要计算公式,然后把它放回同一行,同一列。例如E25的值为"=E2*E4",我需要计算E2E4并将其放回E25。你知道吗

我怎样才能做到这一点?你知道吗

这是目前为止的代码

import re

d = {
    "B2": 1000,
    "C2": 900,
    "D2": 880,
    "E2": 860,
    "F2": 840,
    "G2": 800,
    "B4": 0.95,
    "C4": 0.90,
    "D4": 0.80,
    "E4": 0.80,
    "F4": 0.70,
    "G4": 0.60,
    "B19": 0.001,
    "C19": 0.001,
    "D19": 0.001,
    "E19": 0.001,
    "F19": 0.001,
    "G19": 0.002,
    "B20": 4,
    "C20": 3,
    "D20": 4,
    "E20": 4,
    "F20": 3,
    "G20": 4,
    "B25": "=B2*B4",
    "C25": "=C2*C4",
    "D25": "=D2*D4",
    "E25": "=E2*E4",
    "F25": "=F2*F4",
    "G25": "=G2*G4",
    "B22": 0,
    "C22": "=SUM(B22:B28)",
    "D22": "=SUM(C22:C28)",
    "E22": "=SUM(D22:D28)",
    "F22": "=SUM(E22:E28)",
    "G22": "=SUM(F22:F28)",
    "B28": "=B19*B20*B22",
    "C28": "=C19*C20*C22",
    "D28": "=D19*D20*D22",
    "E28": "=E19*E20*E22",
    "F28": "=F19*F20*F22",
    "G28": "=G19*G20*G22",
}

a = list()


def split_inp(inp):
    return re.match(r"([a-z]+)([0-9]+)", inp, re.I)


for k, v in d.items():
    match = split_inp(k)
    a.append((match.groups(), v))

import pandas as pd

df = pd.DataFrame()

formula_ = []
for i, j in a:
    if isinstance(j, str) and j.startswith('=') and not j[1:].startswith('S'):
        formula_.append((i, j))

    df.set_value(i[0], i[1], j)

print(df)

operators = ['+', '-', '/', '*']
print(formula_)


def split_op(inp):
    for i in operators:
        if i in inp:
            return inp.partition(i)


for i, j in formula_:
    j = j[1:]
    match = split_op(j)
    print(match)
    g = split_inp(match[0])
    f = split_inp((match[2]))
    new = (g.groups(), match[1], f.groups())
    # print(new)
    # df.set_value(i[0], [1], df.query(new[0][0], new[]))


# if isinstance(j, str) and j.startswith('=') and not j[1:].startswith('S'):
#     j = j[1:]
#     print(j)
#     df.set_value(i[0], i[1], pd.eval(j))
# else:
#     pass

Tags: indfformatchsplitsumprintinp