पायथन से उत्पन्न गतिशील लूप से शून्य मान कैसे छोड़ें?


11

मेरे पास इस तरह एक डेटा-फ्रेम है:

   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 में पॉपुलर हो रहे null वैल्यू को हटाना चाहता हूं। मेरा कोड 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>

यह पायथन में कैसे किया जा सकता है?

जवाबों:


6

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

BTW

आपका समाधान एक के साथ ठीक हो जाएगा 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 = """<END>123</END>"") जोड़ा है लेकिन आउटपुट <DTM>2020-03-29</DTM><END>123</END>नई पंक्ति के बजाय उसी पंक्ति में आ रहा है ।
रिया

1
जब आप इसका उपयोग करते हैं तो f.writeयह आपके लिए कोई धारण नहीं करता है '\n'। आप उन लोगों को अपना bodyस्ट्रिंग मिला । अपने पाद को निर्दिष्ट करेंfooter = """\n<END>123</END>"""
piRSquared
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.