【问题标题】:How to drop null values from dynamic loop generated from Python?如何从 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 中做到这一点?

【问题讨论】:

    标签: python-3.x pandas loops dataframe itertools


    【解决方案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;"""指定您的页脚
    猜你喜欢
    • 1970-01-01
    • 2013-06-26
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多