【发布时间】:2021-06-13 21:41:28
【问题描述】:
我正在使用 Python 中的 ElementTree 和 Pandas 模块进行以下开发:
import xml.etree.ElementTree as ET
import pandas as pd
file_xml = ET.parse('example1.xml')
rootXML = file_xml.getroot()
def transfor_data_atri(rootXML):
file_xml = ET.parse(rootXML)
data_XML = [
{"Name": signal.attrib["Name"],
# "Value": signal.attrib["Value"]
"Value": int(signal.attrib["Value"].split(' ')[0])
} for signal in file_xml.findall(".//Signal")
]
signals_df = pd.DataFrame(data_XML)
extract_name_value(signals_df)
def extract_name_value(signals_df):
#print(signals_df)
signal_ig_st = signals_df[signals_df.Name.isin(["Status"])]
row_values_ig_st = signal_ig_st.T
vector_ig_st = row_values_ig_st.iloc[[1]]
signal_nav_DSP_rq = signals_df[signals_df.Name.isin(["SetDSP"])]
row_values_nav_DSP_rq = signal_nav_DSP_rq.T
vector_nav_DSP_rq = row_values_nav_DSP_rq.iloc[[1]]
signal_HMI_st = signals_df[signals_df.Name.isin(["HMI"])]
row_values_HMI_st = signal_HMI_st.T
vector_HMI_st = row_values_HMI_st.iloc[[1]]
signal_delay_ac = signals_df[signals_df.Name.isin(["Delay"])]
row_values_delay_ac = signal_delay_ac.T
vector_delay_ac = row_values_delay_ac.iloc[[1]]
signal_DSP_st = signals_df[signals_df.Name.isin(["DSP"])]
row_values_DSP = signal_DSP.T
vector_DSP = row_values_DSP.iloc[[1]]
print('1: ', vector_ig_st)
print('2: ', vector_nav_DSP_rq)
print('3: ', vector_HMI_st)
print('4: ', vector_delay_ac)
上面的结果如下,它们是前4个打印,没问题,因为这是客户想要的,但我必须简化或消除重复的代码,以加载任何其他xml文件type:link to long xml,可以读取,不只是example1.xml:
我使用以下代码进行了测试,但在所有情况下,打印结果都会让我分开:
signals_name = signals_df["Name"]
# print(signals_name)
row_signals_name = signals_name.T
# print(row_signals_name)
for i in row_signals_name:
print(i)
我一直在检查 Pandas 是否将 DataFrame 保存为多个维度的数组,在我的情况下它只是二维的,但我找不到如何检查该数组以使我获得变量中的名称类型:
names_list = ['Status', 'SetDSP', 'HMI', 'Delay', 'DSP']
但不是获取硬编码的名称,而是将它们功能化或简化在 Python 代码中的变量中(或删除此函数的重复性),以便当客户端想要使用另一个具有相同结构的 XML 文件时,但对于不在硬编码代码中的其他名称,extract_name_value (signals_df) 函数可以毫无问题地读取它们。预先非常感谢您。
【问题讨论】:
标签: python pandas for-loop elementtree