我有几个 xml 文件,其名称如下:
LLL_ABC0D012_title.xml
LLL_ABC0D013_title.xml
LLL_ABT0G012_title.xml
LLL_ABR0N012_title.xml
“LLL_”后面始终有 8 个字符。
我有一个包含 900 多行的 Excel 文件,如下所示:
参考 | dtp1 | dtp2 | dtp3 |
---|---|---|---|
ABC0D012 | 1_blabla | 1_1_blablabla | 1_1_1_blablablabla |
ABC0D013 | 1_blabla | 1_1_blablabla | 1_1_1_blablablabla |
ABC0D014 | 1_blabla | 1_1_blablabla | 1_1_1_blablablabla |
ABT0G012 | 1_blabla | 1_1_blablabla | 1_1_1_blablablabla |
在我的 xml 文件中,我有
为此,我希望我的脚本执行一个循环,读取 xml 文件标题中的 ABC0D012 字符(然后是其他字符),在 Excel 文件的“引用”列中找到匹配项,然后查找相应的“dtp1”、“dtp2”和“dtp3”中的值。 然后我想将这些值保存在变量中以替换标签中的文本。
我是Python初学者。我尝试过类似的事情:
import numpy as np
import openpyxl
import pandas as pd
import xml.etree.ElementTree as ET
import os
table1 = pd.read_excel('C:/Users/Documents/datatypes.xlsx', na_values=['NA'])
table2 = table1.replace('\xa0', ' ',regex=True)
for root, dirs, files in os.walk("."):
for file in files :
if file[-4:] == '.xml':
#print(file)
xml = ET.parse('LLL_ABC0D012_title.xml')
root = xml.getroot()
dtp1_xml = root[8]
dtp2_xml = root[9]
dtp3_xml = root[10]
num = file[4:12]
#print(num)
dtp1_excel = table2['dtp1'].where(table2['reference'] == num)
dtp1_xml.text = dtp1_excel
#print(dtp1_xml.text)
ET.indent(root)
xml.write("LLL_ABC0D012_title.xml", encoding='utf-8', xml_declaration=True, method='xml')
但它不起作用,“dtp1_excel”不会从打印函数中的表中返回 dtp1 值,而是类似:
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
...
931 NaN
932 NaN
933 NaN
934 NaN
935 NaN
Name: dtp1, Length: 936, dtype: object
我在引用和 dtp1 列中没有 NaN 值,它应该只返回单个单元格值。
我的方法有什么问题吗?你能帮我吗?
主要问题是
.where()
返回所有行NaN
放入不匹配的行中,并将值保留在匹配的行中。
例如
import pandas as pd
data = {
'X': ['A','B','C'],
'Y': ['D','E','F'],
'Z': ['G','H','I']
}
df = pd.DataFrame(data)
df['X'].where(df['Y'] == 'E')
给出
0 NaN
1 B
2 NaN
Name: X, dtype: object
但是
df['X'][df['Y'] == 'E']
给出
1 B
Name: X, dtype: object
但是两者都给出了Series,它仍然需要使用
[index]
或.iloc[row_number]
来获取值
results = df['X'][df['Y'] == 'E']
print(results[1]) # row's index is `1`
print(results.iloc[0]) # row's numer is `0`
完整的工作示例:
import pandas as pd
data = {
'X': ['A','B','C'],
'Y': ['D','E','F'],
'Z': ['G','H','I']
}
df = pd.DataFrame(data)
print('---')
print(df)
print("--- [df['Y'] == 'E'] ---")
results = df['X'][df['Y'] == 'E']
print(results)
print('type:', type(results))
print("--- .where(df['Y'] == 'E') ---")
results = df['X'].where(df['Y'] == 'E')
print(results)
print('type:', type(results))
results = df['X'][df['Y'] == 'E']
print("---")
print(' [1]:', results[1])
print('.iloc[0]:', results.iloc[0])