Python 使用 pandas groupby 将 CSV 转换为 XML
Python convert CSV to XML with pandas groupby
我有一个 csv,我需要使用 Python 将其转换为 XML。我是新手python开发
示例 CSV 数据:
Amount,Code
CODE50,1246
CODE50,6290
CODE25,1077
CODE25,9790
CODE100,5319
CODE100,4988
需要输出XML
<coupon-codes coupon-id="CODE50">
<code>1246</code>
<code>1246</code>
<coupon-codes/>
<coupon-codes coupon-id="CODE25">
<code>1077</code>
<code>9790</code>
<coupon-codes/>
<coupon-codes coupon-id="CODE100">
<code>5319</code>
<code>4988</code>
<coupon-codes/>
我的猜测是我必须使用 pandas 将 csv 拉入,使用 pandas.groupby
将 Amount
列分组,然后将其推入 element/subelement 以创建 xml,然后 print/push 到 xml 文件。我无法让 groupby
工作,也不知道如何将其推入元素,然后填充子元素。
import xml.etree.ElementTree as ET
import pandas as pd
df = pd.read_csv('path/to/csvfile.csv')
root = ET.Element('root')
for coupon_id, df_group in df.groupby('Amount'):
coupon_codes = ET.Element('coupon-codes', {'coupon-id': coupon_id})
for coupon_code in df_group['Code']:
code = ET.Element('code')
code.text = str(coupon_code)
coupon_codes.append(code)
root.append(coupon_codes)
要将其转换为缩小的字符串,请使用:
min_xml = ET.tostring(root, encoding='utf8')
print(min_xml)
输出:
<root><coupon-codes coupon-id="CODE100"><code>5319</code><code>4988</code></coupon-codes><coupon-codes coupon-id="CODE25"><code>1077</code><code>9790</code></coupon-codes><coupon-codes coupon-id="CODE50"><code>1246</code><code>6290</code></coupon-codes></root>
要将其转换为格式化字符串,请使用:
ET.indent(root)
pretty_xml = ET.tostring(root, encoding='utf8')
print(pretty_xml)
输出:
<root>
<coupon-codes coupon-id="CODE100">
<code>5319</code>
<code>4988</code>
</coupon-codes>
<coupon-codes coupon-id="CODE25">
<code>1077</code>
<code>9790</code>
</coupon-codes>
<coupon-codes coupon-id="CODE50">
<code>1246</code>
<code>6290</code>
</coupon-codes>
</root>
ElementTree 可以轻松做到。见下文
from collections import defaultdict
from xml.etree.ElementTree import Element, SubElement,ElementTree
data = defaultdict(list)
with open('in.txt') as f:
next(f)
for line in f:
parts = line.split(',')
data[parts[0]].append(parts[1].strip())
root = Element('root')
for k,v in data.items():
sub = SubElement(root,'coupon-codes',attrib={'coupon-id':k})
for vv in v:
sub_v = SubElement(sub,'code')
sub_v.text = vv
tree = ElementTree(root)
with open('out.xml', 'w') as f:
tree.write(f, encoding='unicode')
我还不能发表评论,但如果你把你用来尝试解决问题的代码放在一起会更好。
但是这里有一个非常相似的问题,
这里是 post 分组依据 group by/cumcount
有了这些信息,我通过这样做实现了它
df = pd.DataFrame(['CODE50',
'CODE50',
'CODE25',
'CODE25',
'CODE100',
'CODE100'],columns=['code'])
df['amount'] = [1246,
6290,
1077,
9790,
5319,
4988]
df['columns'] = df.groupby('code')['amount'].cumcount()
result = df.pivot(index='code', columns='columns')
def convert(df):
str = ''
for a in df.index:
str += '\n'f"""<coupon-codes coupon-id="{a}">"""
for b in df['amount'].loc[a]:
str += '\n'' 'f"<code>{b}</code>"
return str
xml = convert(result)
print(xml)
结果
<coupon-codes coupon-id="CODE100">
<code>5319</code>
<code>4988</code>
<coupon-codes coupon-id="CODE25">
<code>1077</code>
<code>9790</code>
<coupon-codes coupon-id="CODE50">
<code>1246</code>
<code>6290</code>
为什么不使用 df.to_xml()?这个简单的 api 将从数据帧
生成 xml
我有一个 csv,我需要使用 Python 将其转换为 XML。我是新手python开发
示例 CSV 数据:
Amount,Code
CODE50,1246
CODE50,6290
CODE25,1077
CODE25,9790
CODE100,5319
CODE100,4988
需要输出XML
<coupon-codes coupon-id="CODE50">
<code>1246</code>
<code>1246</code>
<coupon-codes/>
<coupon-codes coupon-id="CODE25">
<code>1077</code>
<code>9790</code>
<coupon-codes/>
<coupon-codes coupon-id="CODE100">
<code>5319</code>
<code>4988</code>
<coupon-codes/>
我的猜测是我必须使用 pandas 将 csv 拉入,使用 pandas.groupby
将 Amount
列分组,然后将其推入 element/subelement 以创建 xml,然后 print/push 到 xml 文件。我无法让 groupby
工作,也不知道如何将其推入元素,然后填充子元素。
import xml.etree.ElementTree as ET
import pandas as pd
df = pd.read_csv('path/to/csvfile.csv')
root = ET.Element('root')
for coupon_id, df_group in df.groupby('Amount'):
coupon_codes = ET.Element('coupon-codes', {'coupon-id': coupon_id})
for coupon_code in df_group['Code']:
code = ET.Element('code')
code.text = str(coupon_code)
coupon_codes.append(code)
root.append(coupon_codes)
要将其转换为缩小的字符串,请使用:
min_xml = ET.tostring(root, encoding='utf8')
print(min_xml)
输出:
<root><coupon-codes coupon-id="CODE100"><code>5319</code><code>4988</code></coupon-codes><coupon-codes coupon-id="CODE25"><code>1077</code><code>9790</code></coupon-codes><coupon-codes coupon-id="CODE50"><code>1246</code><code>6290</code></coupon-codes></root>
要将其转换为格式化字符串,请使用:
ET.indent(root)
pretty_xml = ET.tostring(root, encoding='utf8')
print(pretty_xml)
输出:
<root>
<coupon-codes coupon-id="CODE100">
<code>5319</code>
<code>4988</code>
</coupon-codes>
<coupon-codes coupon-id="CODE25">
<code>1077</code>
<code>9790</code>
</coupon-codes>
<coupon-codes coupon-id="CODE50">
<code>1246</code>
<code>6290</code>
</coupon-codes>
</root>
ElementTree 可以轻松做到。见下文
from collections import defaultdict
from xml.etree.ElementTree import Element, SubElement,ElementTree
data = defaultdict(list)
with open('in.txt') as f:
next(f)
for line in f:
parts = line.split(',')
data[parts[0]].append(parts[1].strip())
root = Element('root')
for k,v in data.items():
sub = SubElement(root,'coupon-codes',attrib={'coupon-id':k})
for vv in v:
sub_v = SubElement(sub,'code')
sub_v.text = vv
tree = ElementTree(root)
with open('out.xml', 'w') as f:
tree.write(f, encoding='unicode')
我还不能发表评论,但如果你把你用来尝试解决问题的代码放在一起会更好。
但是这里有一个非常相似的问题,
这里是 post 分组依据 group by/cumcount
有了这些信息,我通过这样做实现了它
df = pd.DataFrame(['CODE50',
'CODE50',
'CODE25',
'CODE25',
'CODE100',
'CODE100'],columns=['code'])
df['amount'] = [1246,
6290,
1077,
9790,
5319,
4988]
df['columns'] = df.groupby('code')['amount'].cumcount()
result = df.pivot(index='code', columns='columns')
def convert(df):
str = ''
for a in df.index:
str += '\n'f"""<coupon-codes coupon-id="{a}">"""
for b in df['amount'].loc[a]:
str += '\n'' 'f"<code>{b}</code>"
return str
xml = convert(result)
print(xml)
结果
<coupon-codes coupon-id="CODE100">
<code>5319</code>
<code>4988</code>
<coupon-codes coupon-id="CODE25">
<code>1077</code>
<code>9790</code>
<coupon-codes coupon-id="CODE50">
<code>1246</code>
<code>6290</code>
为什么不使用 df.to_xml()?这个简单的 api 将从数据帧
生成 xml