如何获取excel表格数据并将其转换为python代码来转换数据

问题描述 投票:0回答:1

我有一个类似于案例陈述的 Excel 文件:

状况 操作员 比较 输出
国家 == “美国” '1'
国家 == “英国” '2'

-条件是csv数据文件中的列名 -只有当语句为真时才应返回输出

Excel 文件是动态的,以便任何用户都可以添加新语句,并且脚本将自动能够使用新规则转换数据。

我想循环遍历所有 Excel 语句并在列级别转换 csv 文件。

我的问题是如何将 Excel 表格数据转换为工作的 Python 代码?

我尝试了 eval() 和 getattr() 方法:

import pandas as pd

df = pd.read_csv('DummyData.csv')

transform = pd.read_excel("t.xlsx")

def transform_data(row):
    for i in range(len(transform)):
        condition = transform.iloc[i,0]
        operator = transform.iloc[i,1]
        comparison = transform.iloc[i,2]
        output = transform.iloc[i,3]
        
        if eval(f"row['{condition}']{operator}"):
            return output
        return None
        
df["Country"] = df.apply(transform_data(1), axis = 1)


或getattr(),其中excel文件的比较部分在运算符列中

import pandas as pd
import operator
df = pd.read_csv('DummyData.csv')

transform = pd.read_excel("t.xlsx")
def transform_data(row):
    for i in range(len(transform)):
        condition = transform.iloc[i,0]
        operator_str = transform.iloc[i,1]
        output = transform.iloc[i,2]
        
        operator_func = getattr(operator, operator_str)
        
        if operator_func(row[condition],output):
            return output
    return None

df["Country"] = df.apply(transform_data, axis = 1)

但是没有任何效果,我不知道如何继续

python pandas excel transform
1个回答
0
投票

我认为你必须完成你的

eval
语句才能获得正确的输出。

而且我还向左移动了

return None
1 个缩进,因为您想应用所有变换检查并在返回 None 之前查看它们是否适合(即完成
for
循环)。

transform = pd.DataFrame({'Condition': ['Country', 'Country'],
    'Operator': ['==', '=='],
    'Comparison': ['US', 'UK'],
    'Output': ['1', '2']
})

df = pd.DataFrame({
    'Country': ['US', 'UK', 'other']
})

def transform_data(row):
    for i in range(len(transform)):
        condition = transform.iloc[i,0]
        operator = transform.iloc[i,1]
        comparison = transform.iloc[i,2]
        output = transform.iloc[i,3]
        
        if eval(f"row['{condition}']{operator}'{comparison}'"):
            return output
    return None
        
print(df.apply(transform_data, axis=1))

输出:

0       1
1       2
2    None
dtype: object
© www.soinside.com 2019 - 2024. All rights reserved.