【问题标题】:Mutli-level index using only certain values from 2 columns仅使用 2 列中的某些值的多级索引
【发布时间】:2021-12-07 12:48:56
【问题描述】:

早上好! 我对 pandas/python 很陌生。我目前的 ETL 主要使用 SQL 和 SSIS,但对于新的数据源,它需要在 Excel 中进行繁琐的手动重新格式化。我正在尝试学习 python 以节省数小时的手动工作。报告中的数据极其冗余。我花了好几天的时间试图用一种能返回我需要的信息的方式来表达我需要的东西,但无济于事。

我不能使用我的实际数据,因为它包含 PHI,所以我将给出一个使用客户和订单的类似示例。外部系统生成“MonthlyOrders.xls”报告。导出格式几乎有零灵活性。 .xls 文件扩展名让您了解源环境的过时程度。首先,我将数据加载到数据框中,并按“组”将其拆分为较小的数据框。所以每个df代表一个组。之后的样子是这样的:

一般格式:

index Name/Date ID/Item Price/ 'P' Billed/'NaaN' PaidOn/Seller Total/Dept
1 ClientName Client ID 'P' Date Billed Pmt_received_On Order Total
2 Order Date item name item price 'NaaN' sold by dept
3 Same order date 2nd item price 'Naan' sold by dept
4 NextClientName NextID 'P' Date Billed Pmt_received_On Order Total

数据示例:

Index Name/Date ID/Item Price/ 'P' Billed/'NaaN' PaidOn/Seller Total/Dept
1 Victim, One VO100 'P' 08/12/2021 08/13/2021 78
2 08/11/2021 books 12 'NaaN' Mrs. White The Study
3 08/11/2021 Rope 56 'Naan' Mrs. White The Study
4 08/11/2021 Pens 10 'NaaN' Mrs. White The Study
5 Second, Dead SD123 'P' 08/18/2021 08/20/2021 250
6 08/17/2021 Pool Cue 198 'NaaN' Mr. Green Billiard Room
7 08/17/2021 Knife 52 'Naan' Mr. Green Billiard Room

我想做的是使用客户名称和客户 ID、OrderDate 创建一个多级索引。 也许我可以将 Name:ID 作为字典并将其用作第一级索引,然后日期将成为下一个级别。我不确定我是否可以这样做。

或者,我想将第一列和第二列分成四列(名称、ID、orderDate、Item)。我不使用“订单总计”列。数据进入 Billing_Import 临时表,然后在数据仓库中进一步操作和转换。目标表的结构如下:

RecID Group ClientName OrderDate ClientID ItemID desc ChgAmt pmtAmt seller dept

在 SSIS 中添加了“RecID”,并在使用 SQL 导入后从“Desc”列中拆分出“Item ID”。我计划在每个数据框中添加一个“组”列,这样我就知道哪些数据属于哪个组。目前,这些组位于单独的数据框中。

订单的“部门”始终相同。几乎总是只有一个“卖家”,但如果一个订单上有 2 个卖家,则会添加另一条记录。

我想要的格式是这样的:

Group ID Name OrderDate ItemDesc Charge Pmt Seller Department
Group1
ID1a Name1a 1/1/2021 item1 $x $y Ms. Scarlet The Lounge
item2 $x $y Ms. Scarlet
item3 $x $y Ms. Scarlet
ID2a Name2b 1/15/2021 item1 $x $y Mrs. Peacock The Kitchen
item2 $x $y Mrs. Peacock
Group2
ID2a Name2a 1/22/2021 item1 $x $y Wadsworth The Cellar
item2 $x $y Wadsworth
ID2a Name2a 1/22/2021 item1 $x $y Col. Mustard The Cellar

非常感谢任何和所有建议!

最诚挚的问候,

科里

【问题讨论】:

    标签: pandas multi-index


    【解决方案1】:

    第一步是将列分隔成类似于以下的格式:

    index name date ID item price billed paid_on seller total dept
    1 John 10/20/21 1234 socks 10 10/12/21 10/20/21 James 10 garments

    完成此步骤后,您可以使用以下方法创建多索引:

    df_muti_index = df.set_index(['ID', 'name', 'date'])
    

    【讨论】:

    • 问题是Name和ID只在第一行,后面的x行有订单详情。从示例数据:
    • 问题是客户 ID 只在第一行,所以我需要将该 ID 附加到它下面的后续 x 行。在我的示例中,索引行 1-4 行都是一个订单,但第 2-4 行不绑定到客户的 ID。我需要将其格式化:|身份证 |姓名 |日期 |项目1 |价格1 |项目2 |价格2 |项目3 |价格3 |卖家 |部门 | |VO100 |受害者,一个 | 2021 年 8 月 11 日|书籍 | 12 |绳索| 56 |钢笔 |10 |夫人白色 |研究 |订单详情仅在客户下方列出,与任何人无关。这有意义吗?
    猜你喜欢
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 2020-09-28
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多