多次融化熊猫数据框

时间:2020-08-13 17:21:30

标签: python pandas pivot reshape melt

我有一个数据框df:

Item   Name  Location  Jan-Units  Feb-Units  Mar-Units  Jan-Rev  Feb-Rev  Mar-Rev  Jan-Trl  Feb-Trl  Mar-Trl
123    ABC   CA        20         30        40          100      150      200      1.00     1.50     2.00
456    DEF   AZ        25         35        45          125      175      225      1.25     1.75     2.25

我需要多次熔化此df,使前3列保持不变,并根据熔化的列的前3个字符添加日期列。输出应为:

Item    Name  Location  Date        Units  Rev   Trl
123     ABC   CA        01/01/2020  20     100   1.00
123     ABC   CA        02/01/2020  30     150   1.50
123     ABC   CA        03/01/2020  40     200   2.00
456     DEF   AZ        01/01/2020  25     125   1.25
456     DEF   AZ        02/01/2020  35     175   1.75
456     DEF   AZ        03/01/2020  45     225   2.25

(实际df包含2020年的所有月份和几百行)

1 个答案:

答案 0 :(得分:6)

首先重塑您的列,然后使用pd.wide_to_long

import pprint
import xmltodict

xml = '''<r><department name="RnD">
    <section name="Prototyping">
        <room name="A.2.25">
            <machine name="Yamaha YSM" serial="123456"/>
            <machine name="Yamaha YSM" serial="123556"/>
            <machine name="Yamaha YSM" serial="654321"/>
            <machine name="Omron X-Ray" serial="X235-566"/>
        </room>
    </section>
    <department name="Oper">
    <section name="SectionName">
        <room name="A.2.25">
            <machine name="Yamaha YSM" serial="123456"/>
            <machine name="Yamaha YSM" serial="123556"/>
            <machine name="Yamaha YSM" serial="654321"/>
            <machine name="Omron X-Ray" serial="X235-566"/>
        </room>
        <room name="A.2.251">
            <machine name="Yamaha YSM" serial="123456"/>
            <machine name="Yamaha YSM" serial="123556"/>
            <machine name="Yamaha YSM" serial="654321"/>
            <machine name="Omron X-Ray" serial="X235-566"/>
        </room>
    </section>
</department>
</department></r>'''
data = xmltodict.parse(xml)
pprint.pprint(data)
print(data['r']['department']['@name'])