我有一个类似于案例陈述的 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)
但是没有任何效果,我不知道如何继续
我认为你必须完成你的
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