如何从 Python 生成的动态循环中删除空值?

Posted

技术标签:

【中文标题】如何从 Python 生成的动态循环中删除空值?【英文标题】:How to drop null values from dynamic loop generated from Python? 【发布时间】:2020-06-05 01:07:41 【问题描述】:

我有一个这样的数据框:

   ORDER_NO         2401        2504         2600
    2020020         2019-12-04  2019-12-10   2019-12-12 
    2020024         2019-12-25  NaN          2019-12-20
    2020034         NaN         NaN          2019-12-20
    2020020         2019-12-12  2019-12-15   2019-12-18

我正在从上述数据框创建 XML。我想删除填充到 XML 中的空值。 我的代码应该从 XML 中删除特定的列和行值。

我的代码

header = """<ORD></ORD>"""
body ="""
<osi:ORDSTSINF types:STSCDE="">
<DTM></DTM>"""

cols = df.columns
for row in df.itertuples():
    with open(f'row[1].xml', 'w') as f:
        f.write(header.format(row[1]))
        for c, r in zip(row[2:], cols[1:]):
            f.write(body.format(r, c))

记录 2 的当前输出

<ORD>2020024</ORD>
<osi:ORDSTSINF types:STSCDE="2401">
<DTM>2019-12-25</DTM>
<osi:ORDSTSINF types:STSCDE="2504">
<DTM>NaN</DTM>
<osi:ORDSTSINF types:STSCDE="2600">
<DTM>2019-12-20</DTM>

记录 2 的预期输出

 <ORD>2020024</ORD>
    <osi:ORDSTSINF types:STSCDE="2401">
    <DTM>2019-12-25</DTM>
    <osi:ORDSTSINF types:STSCDE="2600">
    <DTM>2019-12-20</DTM>

如何在 Python 中做到这一点?

【问题讨论】:

【参考方案1】:

stack

自然删除空值

header = """<ORD></ORD>"""
body ="""
<osi:ORDSTSINF types:STSCDE="">
<DTM></DTM>"""

for o, d in df.set_index('ORDER_NO').stack().groupby('ORDER_NO'):
    with open(f'o.xml', 'w') as f:
        f.write(header.format(o))
        for (o, s), date in d.iteritems():
            f.write(body.format(s, date))

详情

df.set_index('ORDER_NO').stack()

ORDER_NO      
2020020   2401   2019-12-04
          2504   2019-12-10
          2600   2019-12-12
2020024   2401   2019-12-25
          2600   2019-12-20
2020034   2600   2019-12-20
2020020   2401   2019-12-12
          2504   2019-12-15
          2600   2019-12-18

顺便说一句

if 可以解决您的问题

header = """<ORD></ORD>"""
body ="""
<osi:ORDSTSINF types:STSCDE="">
<DTM></DTM>"""

cols = df.columns
for row in df.itertuples():
    with open(f'row[1].xml', 'w') as f:
        f.write(header.format(row[1]))
        for c, r in zip(row[2:], cols[1:]):
            if pd.notna(c):
                f.write(body.format(r, c))

【讨论】:

我刚刚添加了一个页脚 (footer = """&lt;END&gt;123&lt;/END&gt;"") 但输出在同一行 &lt;DTM&gt;2020-03-29&lt;/DTM&gt;&lt;END&gt;123&lt;/END&gt; 而不是新行。 当您使用f.write 时,它不会假定为您放置'\n'。你从你的body 字符串中得到了这些。使用footer = """\n&lt;END&gt;123&lt;/END&gt;"""指定您的页脚

以上是关于如何从 Python 生成的动态循环中删除空值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中动态生成嵌套for循环[重复]

使用POWERQUERY 怎么总是删不掉这个空值?求帮助使用POWERQUERY 怎么总是删不掉这个空值?求帮助

100天精通Python(数据分析篇)——第68天:Pandas数据清洗函数大全(判断缺失删除空值填补空值替换元素分割元素)

如何从 ColdFusion 查询循环中的返回值中检查空值

如何从动态生成的 iframe 中删除 onload 事件?

如何删除杰克逊自定义序列化程序生成的空值?