python-3.x - 如何从 Python 生成的动态循环中删除空值?

标签 python-3.x pandas loops dataframe itertools

我有一个这样的数据框:

   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 中完成?

最佳答案

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))

关于python-3.x - 如何从 Python 生成的动态循环中删除空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60324481/

相关文章:

基于Python的简单计时器脚本无法正常工作

pandas - pandas 中给定日期的周数

language-agnostic - 继续认为有害吗?

c++ - 从 Boost 库 C++ 循环创建图形

mysql - Django 操作错误(2013, "Lost connection to MySQL server during query")

Python 3 : setup. py:执行所有操作的 pip 安装 (build_ext + install)

python - 向 Pandas 数据框中的每个单元格添加不同的随机数

python - 应用循环后原始数据帧没有变化

python-3.x - 为什么我的程序在输入 "q"后没有退出?

python - 如何将一个包含 +1.048.576 行的数据框导出到多个 Excel 文件/工作表中