পাইথন থেকে উত্পন্ন ডায়নামিক লুপ থেকে নাল মানগুলি কীভাবে বাদ দেওয়া যায়?


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 থেকে সেই নির্দিষ্ট কলাম এবং সারি মানটি ফেলে দেওয়া উচিত।

আমার কোড

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>"""
পাদলেখকে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.