파이썬에서 생성 된 동적 루프에서 null 값을 삭제하는 방법은 무엇입니까?


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>새 줄 대신 동일한 줄에 들어옵니다 .
Ria Alves

1
당신이 f.write그것을 사용할 때 당신을 대신 한다고 가정하지 않습니다 '\n'. 당신은 당신의 body문자열 형태를 얻었다 . 과 바닥 글을 지정footer = """\n<END>123</END>"""
piRSquared
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.