【问题标题】:Transposing Data in Pandas在 Pandas 中转置数据
【发布时间】:2020-12-02 06:03:45
【问题描述】:

我有一个 Excel 文件,其中包含零件在其生命周期内使用了多少次的计数。数据当前以序列号在 A 列中的方式存储,每个“寿命”计数存储在相邻列中,并以“日期”值作为其标题。
这是一个例子:

Image1

我希望能够在 Python 中旋转/转置所有 Date 列,以便输出采用以下格式,并将 Lifespan Count 作为名为“Count”的新列:

Image2

我尝试在 pandas 中使用 pivot 函数来翻转适当的行和列,但问题是我必须一次定义每一列。此示例中使用的电子表格的性质只是我使用的几个电子表格之一,它们都从不同的日期开始(一些从 01/01/2010 开始呈现,而另一些从 01/01/1999 开始呈现)。值得注意的是,所有电子表格都从每月的第一天开始,每次增加 1 个月。

因此,有没有一种方法可以让我通过加载的电子表格选择我已加载到数据框中的所有列,以便能够像提到的那样对数据进行透视/转置?

pivot = df.pivot_table(index=['Serial'], values=['01/01/2019','01/02/2019',... etc], aggfunc='max'])

【问题讨论】:

    标签: excel pandas python-3.5 transpose


    【解决方案1】:

    stack() 的简单使用,如果你有命名你的列系列并且你的行上有set_index()

    import datetime as dt
    import random
    df = pd.DataFrame({**{"Serial":[s for s in range(1111,1121)]}, 
     **{d:[random.randint(0,150) for i in range(10)] for d in pd.date_range(start=dt.date(2019,1,1), end=dt.date(2019,1,6))}
    }).set_index("Serial")
    df.columns.set_names("Date", inplace=True)
    dfs = df.stack().to_frame().rename(columns={0:"Count"})
    
    print(f"{df.iloc[:,:3].to_string()}\n\n{dfs.iloc[:10].to_string()}")
    

    样本输出

    Date    2019-01-01 00:00:00  2019-01-02 00:00:00  2019-01-03 00:00:00
    Serial                                                               
    1111                    134                   76                    8
    1112                    115                   37                    8
    1113                     16                   23                  130
    1114                    108                   45                   69
    1115                      0                   51                  111
    1116                     51                   71                  101
    1117                    107                   10                  142
    1118                     80                   48                  134
    1119                    148                   62                   75
    1120                      4                  135                  100
    
                                Count
    Serial Date                      
    1111   2019-01-01 00:00:00    134
           2019-01-02 00:00:00     76
           2019-01-03 00:00:00      8
           2019-01-04 00:00:00     16
           2019-01-05 00:00:00    140
           2019-01-06 00:00:00     28
    1112   2019-01-01 00:00:00    115
           2019-01-02 00:00:00     37
           2019-01-03 00:00:00      8
           2019-01-04 00:00:00     56
    

    【讨论】:

    • 感谢您的解决方案,尽管我应该指出我无权访问“日期时间”或“随机”库。我的环境的性质仅限于 3.5.2 的默认库。序列号也是不连续的,我只是在示例中使用了随机序列号。这不能通过 pandas 或 numpy 实现吗?
    • 您也不需要...您将示例数据作为图像提供,这意味着我必须生成它。为了生成它,我使用了 datetimerandom,因为没有数据可以从你那里粘贴
    • 序列号的顺序绝对没有限制
    • 哇...不知道谢谢你的想法!如何阻止 pandas 将列自动格式化为日期时间值?我希望它保持 Excel 中的格式(“01/01/2010”而不是“2010-01-01 00:00:00”)。
    • 另外我认为我不能在 3.5.2 中使用 F 字符串可以吗?
    猜你喜欢
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2021-02-09
    相关资源
    最近更新 更多