首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pandas读取excel列中的xml,并基于数据创建新列。

Pandas读取excel列中的xml,并基于数据创建新列。
EN

Stack Overflow用户
提问于 2020-08-10 13:13:17
回答 2查看 51关注 0票数 0

我有一个excel,它有一个xml格式的数据列。

代码语言:javascript
运行
复制
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中的有效负载,并以列的形式输出每个元素,例如:

代码语言:javascript
运行
复制
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 
EN

回答 2

Stack Overflow用户

发布于 2020-08-10 15:55:15

也许你可以使用find()和一个循环(带索引)来完成:

代码语言:javascript
运行
复制
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>')]
票数 0
EN

Stack Overflow用户

发布于 2020-08-10 16:34:00

您可以采取将xml转换为JSON的方法,使其对pythonpandas更加友好。为此,我使用了xmlplain

JSON

  • 生成一个新临时列,它的有效负载为。我还将其从{'Insert': {'emp:Emp': [{'ebo:Id': '001'}, {'ebo:Name': 'Name 1'}]}}重新格式化为{'Main': 'Insert', 'SubNode': 'emp:Emp', 'ebo:Id': '001', 'ebo:Name': 'Name 1'}
  1. make此列中的一个新数据帧,并将其concat()回去,因此现在您拥有了所有列

代码语言:javascript
运行
复制
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))

输出

代码语言:javascript
运行
复制
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 5
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63334457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档