我有一个excel,它有一个xml格式的数据列。
ID Color Payload Misc
1 Green <Insert><emp:Emp><ebo:Id>001</ebo:Id><ebo:Name>Name 1</ebo:Name></emp:Emp></Insert> 23
2 Yellow <Insert><emp:Emp><ebo:Id>002</ebo:Id><ebo:Name>Name 2</ebo:Name></emp:Emp></Insert> 34
3 Blue <Insert><emp:Emp><ebo:Id>003</ebo:Id><ebo:Name>Name 3</ebo:Name></emp:Emp></Insert> 3UE
4 Red <Insert><emp:Emp><ebo:Id>004</ebo:Id><ebo:Name>Name 4</ebo:Name></emp:Emp></Insert> 534
5 Orange <Insert><emp:Emp><ebo:Id>005</ebo:Id><ebo:Name>Name 5</ebo:Name></emp:Emp></Insert> RUE 如何读取pandas中的有效负载,并以列的形式输出每个元素,例如:
ID Color Payload MainNode SubNode ID Name Misc
1 Green <Insert><emp:Emp><ebo:Id>001</ebo:Id><ebo:Name>Name 1</ebo:Name></emp:Emp></Insert> Insert EMP 001 Name 1 23
2 Yellow <Insert><emp:Emp><ebo:Id>002</ebo:Id><ebo:Name>Name 2</ebo:Name></emp:Emp></Insert> Insert EMP 002 Name 2 34
3 Blue <Insert><emp:Emp><ebo:Id>003</ebo:Id><ebo:Name>Name 3</ebo:Name></emp:Emp></Insert> Insert EMP 003 Name 3 3UE
4 Red <Insert><emp:Emp><ebo:Id>004</ebo:Id><ebo:Name>Name 4</ebo:Name></emp:Emp></Insert> Insert EMP 004 Name 4 534
5 Orange <Insert><emp:Emp><ebo:Id>005</ebo:Id><ebo:Name>Name 5</ebo:Name></emp:Emp></Insert> Insert EMP 005 Name 5 RUE 发布于 2020-08-10 15:55:15
也许你可以使用find()和一个循环(带索引)来完成:
df['MainNode'] = df['Payload']
for i,row in df.iterrows():
df['MainNode'][i] = df['MainNode'][i][df['MainNode'][i].find('<')+1 : df['MainNode'][i].find('>')]
df['ID'] = df['Payload']
for i,row in df.iterrows():
df['ID'][i] = df['ID'][i][df['ID'][i].find('<ebo:Id>')+8 : df['ID'][i].find('</ebo:Id>')]
df['Name'] = df['Payload']
for i,row in df.iterrows():
df['Name'][i] = df['Name'][i][df['Name'][i].find('<ebo:Name>')+10 : df['Name'][i].find('</ebo:Name>')]发布于 2020-08-10 16:34:00
您可以采取将xml转换为JSON的方法,使其对python和pandas更加友好。为此,我使用了xmlplain
JSON
{'Insert': {'emp:Emp': [{'ebo:Id': '001'}, {'ebo:Name': 'Name 1'}]}}重新格式化为{'Main': 'Insert', 'SubNode': 'emp:Emp', 'ebo:Id': '001', 'ebo:Name': 'Name 1'}concat()回去,因此现在您拥有了所有列import xmlplain
data = """ID Color Payload Misc
1 Green <Insert><emp:Emp><ebo:Id>001</ebo:Id><ebo:Name>Name 1</ebo:Name></emp:Emp></Insert> 23
2 Yellow <Insert><emp:Emp><ebo:Id>002</ebo:Id><ebo:Name>Name 2</ebo:Name></emp:Emp></Insert> 34
3 Blue <Insert><emp:Emp><ebo:Id>003</ebo:Id><ebo:Name>Name 3</ebo:Name></emp:Emp></Insert> 3UE
4 Red <Insert><emp:Emp><ebo:Id>004</ebo:Id><ebo:Name>Name 4</ebo:Name></emp:Emp></Insert> 534
5 Orange <Insert><emp:Emp><ebo:Id>005</ebo:Id><ebo:Name>Name 5</ebo:Name></emp:Emp></Insert> RUE """
a = [[t.strip().replace(",", "") for t in re.split(" ",l) if t!=""] for l in [l for l in data.split("\n")]]
# massage the json from xmlplain to pandas column format
def nicejson(js):
return {**{"Main":k for k in js.keys()},
**{"SubNode":k for k in js["Insert"].keys()},
**{k:v for attset in js["Insert"]["emp:Emp"] for k,v in attset.items() }
}
df = pd.DataFrame(a[1:], columns=a[0])
df = df.assign(jsonraw=lambda dfa: dfa.apply(lambda r: nicejson(xmlplain.xml_to_obj(r["Payload"])), axis=1))
df = pd.concat([df, pd.DataFrame(df["jsonraw"].to_dict()).T], axis=1).drop("jsonraw", axis=1)
print(df.to_string(index=False))输出
ID Color Payload Misc Main SubNode ebo:Id ebo:Name
1 Green <Insert><emp:Emp><ebo:Id>001</ebo:Id><ebo:Name>Name 1</ebo:Name></emp:Emp></Insert> 23 Insert emp:Emp 001 Name 1
2 Yellow <Insert><emp:Emp><ebo:Id>002</ebo:Id><ebo:Name>Name 2</ebo:Name></emp:Emp></Insert> 34 Insert emp:Emp 002 Name 2
3 Blue <Insert><emp:Emp><ebo:Id>003</ebo:Id><ebo:Name>Name 3</ebo:Name></emp:Emp></Insert> 3UE Insert emp:Emp 003 Name 3
4 Red <Insert><emp:Emp><ebo:Id>004</ebo:Id><ebo:Name>Name 4</ebo:Name></emp:Emp></Insert> 534 Insert emp:Emp 004 Name 4
5 Orange <Insert><emp:Emp><ebo:Id>005</ebo:Id><ebo:Name>Name 5</ebo:Name></emp:Emp></Insert> RUE Insert emp:Emp 005 Name 5https://stackoverflow.com/questions/63334457
复制相似问题