Как передать имя столбца в параметр в pandas - PullRequest
4 голосов
/ 20 февраля 2020

Я пытаюсь создать xml из кадра данных. Проблема, с которой я столкнулся, я хочу передать столбец в параметр, и он не работает.

    ORDER_NO        1175        1304          1421  
   7283630          2019-12-04  2019-12-10   2019-12-12 
   7283650          2019-12-25  NaN          2019-12-20

Мой код

header = """<ORD>{}</ORD>"""
body ="""
<osi:ORDSTSINF types:STSCDE="{}">
<DTM>{}</DTM>
</osi:ORDSTSINF>
<osi:ORDSTSINF types:STSCDE="{}">
<DTM>{}</DTM>
</osi:ORDSTSINF>
<osi:ORDSTSINF types:STSCDE="{}">
<DTM>{}</DTM>
</osi:ORDSTSINF>"""

for row in df.itertuples():
    with open(f'{row[1]}.xml', 'w') as f:
        f.write(header.format(row[1]))
        f.write(body.format(col[2], row[2], col[3],row[3],col[4],row[4]))

Я хочу передать имя столбца везде, где STS = {} идет.

Ожидаемый результат

<ORD> 7283630</ORD>
<osi:ORDSTSINF types:STSCDE="1175">
<DTM>2019-12-04</DTM>
<osi:ORDSTSINF types:STSCDE="1304">
<DTM>2019-12-10</DTM>
<osi:ORDSTSINF types:STSCDE="1421">
<DTM>22019-12-12</DTM>

Как это можно сделать в python?

1 Ответ

1 голос
/ 20 февраля 2020

Поскольку python отсчитывают от 0 при индексировании, вычитают 1 из выбора имен столбцов, таких как cols[2] до cols[1] для всех значений:

cols = df.columns
for row in df.itertuples():
    with open(f'{row[1]}.xml', 'w') as f:
        f.write(header.format(row[1]))
        f.write(body.format(cols[1], row[2], cols[2],row[3],cols[3],row[4]))

<ORD>7283630</ORD>
<osi:ORDSTSINF types:STSCDE="1175">
<DTM>2019-12-04</DTM>
</osi:ORDSTSINF>
<osi:ORDSTSINF types:STSCDE="1304">
<DTM>2019-12-10</DTM>
</osi:ORDSTSINF>
<osi:ORDSTSINF types:STSCDE="1421">
<DTM>2019-12-12</DTM>
</osi:ORDSTSINF>

РЕДАКТИРОВАТЬ :

Больше динамических c решений с loop:

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

EDIT1: для пропущенных значений добавьте notna:

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