Làm cách nào để giảm giá trị null từ vòng lặp động được tạo từ Python?


11

Tôi có một khung dữ liệu như thế này:

   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

Tôi đang tạo XML từ khung dữ liệu trên. Tôi muốn loại bỏ giá trị null được đưa vào XML. Mã của tôi sẽ loại bỏ giá trị cột và hàng cụ thể đó khỏi XML.

Mã của tôi

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

Sản lượng hiện tại cho bản ghi 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>

Sản lượng dự kiến ​​cho bản ghi 2

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

Làm thế nào điều này có thể được thực hiện trong Python?

Câu trả lời:


6

stack

Tự nhiên giảm giá trị

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

Chi tiết

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

BTW

Giải pháp của bạn sẽ ổn với một 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))

Tôi vừa thêm một chân trang ( footer = """<END>123</END>"") nhưng đầu ra đang ở cùng một dòng <DTM>2020-03-29</DTM><END>123</END>thay vì dòng mới.
Rịa Alves

1
Khi bạn sử dụng, f.writenó không giả định đặt một cái '\n'cho bạn. Bạn có những hình thức bodychuỗi của bạn . Chỉ định chân trang của bạn vớifooter = """\n<END>123</END>"""
piRSquared
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.