如何从多索引数据框中获取第一个二级索引?

弗朗西斯科

我在 Pandas 中使用来自 UCI 机器学习存储库的在线零售数据集,我正在设置一个包含CustomerID第一级和InvoiceNo第二级的多索引这是代码:

import pandas as pd


customers = pd.read_excel('https://archive.ics.uci.edu/ml/machine-learning-databases/00352/Online%20Retail.xlsx')
customers.set_index(['CustomerID', 'InvoiceNo'], inplace=True)
                     StockCode                          Description  Quantity  
CustomerID InvoiceNo                                                            
17850.0    536365       85123A   WHITE HANGING HEART T-LIGHT HOLDER         6   
           536365        71053                  WHITE METAL LANTERN         6   
           536365       84406B       CREAM CUPID HEARTS COAT HANGER         8   
           536365       84029G  KNITTED UNION FLAG HOT WATER BOTTLE         6   
           536365       84029E       RED WOOLLY HOTTIE WHITE HEART.         6   
           536365        22752         SET 7 BABUSHKA NESTING BOXES         2   
           536365        21730    GLASS STAR FROSTED T-LIGHT HOLDER         6   
           536366        22633               HAND WARMER UNION JACK         6   
           536366        22632            HAND WARMER RED POLKA DOT         6   
13047.0    536367        84879        ASSORTED COLOUR BIRD ORNAMENT        32   
           536367        22745           POPPY'S PLAYHOUSE BEDROOM          6   
           536367        22748            POPPY'S PLAYHOUSE KITCHEN         6   
           536367        22749    FELTCRAFT PRINCESS CHARLOTTE DOLL         8   
           536367        22310              IVORY KNITTED MUG COSY          6   
           536367        84969   BOX OF 6 ASSORTED COLOUR TEASPOONS         6   
           536367        22623        BOX OF VINTAGE JIGSAW BLOCKS          3   
           536367        22622       BOX OF VINTAGE ALPHABET BLOCKS         2   
           536367        21754             HOME BUILDING BLOCK WORD         3   
           536367        21755             LOVE BUILDING BLOCK WORD         3   
           536367        21777          RECIPE BOX WITH METAL HEART         4   
           536367        48187                  DOORMAT NEW ENGLAND         4   
           536368        22960             JAM MAKING SET WITH JARS         6   
           536368        22913          RED COAT RACK PARIS FASHION         3   
           536368        22912       YELLOW COAT RACK PARIS FASHION         3   
           536368        22914         BLUE COAT RACK PARIS FASHION         3   
           536369        21756             BATH BUILDING BLOCK WORD         3   
12583.0    536370        22728            ALARM CLOCK BAKELIKE PINK        24   
           536370        22727            ALARM CLOCK BAKELIKE RED         24   
           536370        22726           ALARM CLOCK BAKELIKE GREEN        12   
           536370        21724      PANDA AND BUNNIES STICKER SHEET        12   
           536370        21883                     STARS GIFT TAPE         24   
           536370        10002          INFLATABLE POLITICAL GLOBE         48   
           536370        21791   VINTAGE HEADS AND TAILS CARD GAME         24   
           536370        21035      SET/2 RED RETROSPOT TEA TOWELS         18   
           536370        22326  ROUND SNACK BOXES SET OF4 WOODLAND         24   
           536370        22629                  SPACEBOY LUNCH BOX         24   
           536370        22659              LUNCH BOX I LOVE LONDON        24   
           536370        22631             CIRCUS PARADE LUNCH BOX         24   
           536370        22661      CHARLOTTE BAG DOLLY GIRL DESIGN        20   
           536370        21731        RED TOADSTOOL LED NIGHT LIGHT        24   
           536370        22900      SET 2 TEA TOWELS I LOVE LONDON         24   
           536370        21913       VINTAGE SEASIDE JIGSAW PUZZLES        12   
           536370        22540           MINI JIGSAW CIRCUS PARADE         24   
           536370        22544                 MINI JIGSAW SPACEBOY        24   
           536370        22492              MINI PAINT SET VINTAGE         36   
           536370         POST                              POSTAGE         3   
13748.0    536371        22086      PAPER CHAIN KIT 50'S CHRISTMAS         80   
17850.0    536372        22632            HAND WARMER RED POLKA DOT         6   
           536372        22633               HAND WARMER UNION JACK         6   
           536373       85123A   WHITE HANGING HEART T-LIGHT HOLDER         6

在这种情况下,我如何获得每个客户的第一张发票?即我如何只返回536367客户的发票号码13047

编辑:更清楚地说,我不希望每个客户只第一次出现发票。我想保持的列如StockCodeDescriptionQuantity

换句话说,我只想保留每个客户的第一个发票编号中的交易信息。以客户 ID13047为例,第一张发票是536367这样我想保留该发票的记录,但我想删除发票536368536369因为它不是它的第一张发票。结果如下所示:

                     StockCode                          Description  Quantity  
CustomerID InvoiceNo                                                            
17850.0    536365       85123A   WHITE HANGING HEART T-LIGHT HOLDER         6   
           536365        71053                  WHITE METAL LANTERN         6   
           536365       84406B       CREAM CUPID HEARTS COAT HANGER         8   
           536365       84029G  KNITTED UNION FLAG HOT WATER BOTTLE         6   
           536365       84029E       RED WOOLLY HOTTIE WHITE HEART.         6   
           536365        22752         SET 7 BABUSHKA NESTING BOXES         2   
           536365        21730    GLASS STAR FROSTED T-LIGHT HOLDER         6   
           536366        22633               HAND WARMER UNION JACK         6   
           536366        22632            HAND WARMER RED POLKA DOT         6   
13047.0    536367        84879        ASSORTED COLOUR BIRD ORNAMENT        32   
           536367        22745           POPPY'S PLAYHOUSE BEDROOM          6   
           536367        22748            POPPY'S PLAYHOUSE KITCHEN         6   
           536367        22749    FELTCRAFT PRINCESS CHARLOTTE DOLL         8   
           536367        22310              IVORY KNITTED MUG COSY          6   
           536367        84969   BOX OF 6 ASSORTED COLOUR TEASPOONS         6   
           536367        22623        BOX OF VINTAGE JIGSAW BLOCKS          3   
           536367        22622       BOX OF VINTAGE ALPHABET BLOCKS         2   
           536367        21754             HOME BUILDING BLOCK WORD         3   
           536367        21755             LOVE BUILDING BLOCK WORD         3   
           536367        21777          RECIPE BOX WITH METAL HEART         4   
           536367        48187                  DOORMAT NEW ENGLAND         4   
12583.0    536370        22728            ALARM CLOCK BAKELIKE PINK        24   
           536370        22727            ALARM CLOCK BAKELIKE RED         24   
           536370        22726           ALARM CLOCK BAKELIKE GREEN        12   
           536370        21724      PANDA AND BUNNIES STICKER SHEET        12   
           536370        21883                     STARS GIFT TAPE         24   
           536370        10002          INFLATABLE POLITICAL GLOBE         48   
           536370        21791   VINTAGE HEADS AND TAILS CARD GAME         24   
           536370        21035      SET/2 RED RETROSPOT TEA TOWELS         18   
           536370        22326  ROUND SNACK BOXES SET OF4 WOODLAND         24   
           536370        22629                  SPACEBOY LUNCH BOX         24   
           536370        22659              LUNCH BOX I LOVE LONDON        24   
           536370        22631             CIRCUS PARADE LUNCH BOX         24   
           536370        22661      CHARLOTTE BAG DOLLY GIRL DESIGN        20   
           536370        21731        RED TOADSTOOL LED NIGHT LIGHT        24   
           536370        22900      SET 2 TEA TOWELS I LOVE LONDON         24   
           536370        21913       VINTAGE SEASIDE JIGSAW PUZZLES        12   
           536370        22540           MINI JIGSAW CIRCUS PARADE         24   
           536370        22544                 MINI JIGSAW SPACEBOY        24   
           536370        22492              MINI PAINT SET VINTAGE         36   
           536370         POST                              POSTAGE         3   
13748.0    536371        22086      PAPER CHAIN KIT 50'S CHRISTMAS         80   
17850.0    536372        22632            HAND WARMER RED POLKA DOT         6   
           536372        22633               HAND WARMER UNION JACK         6   
汤姆

感觉有点短,但似乎有效。拉出发票编号,groupby客户 ID,选择每组中的第一个发票:

customer_ids = customers.index.get_level_values(0)
invoices = pd.Series(customers.index.get_level_values(1))
first_invoices = invoices.groupby(customer_ids, sort=False).first()

结果:

CustomerID
17850.0    536365
13047.0    536367
12583.0    536370
13748.0    536371
15100.0    536374
 
13436.0    581233
15520.0    581241
13298.0    581385
14569.0    581416
12713.0    581578
Name: InvoiceNo, Length: 4372, dtype: object

然后你就可以做出listtuple对(客户ID,发票编号),并使用该索引的原始数据:

ids_invoices = list(zip(first_invoices.index, first_invoices))
customers = customers[customers.index.isin(ids_invoices)]

结果:

                     StockCode  ...         Country
CustomerID InvoiceNo            ...                
17850.0    536365       85123A  ...  United Kingdom
           536365        71053  ...  United Kingdom
           536365       84406B  ...  United Kingdom
           536365       84029G  ...  United Kingdom
           536365       84029E  ...  United Kingdom
           536365        22752  ...  United Kingdom
           536365        21730  ...  United Kingdom
13047.0    536367        84879  ...  United Kingdom
           536367        22745  ...  United Kingdom
           536367        22748  ...  United Kingdom
           536367        22749  ...  United Kingdom
           536367        22310  ...  United Kingdom
           536367        84969  ...  United Kingdom
           536367        22623  ...  United Kingdom
           536367        22622  ...  United Kingdom
           536367        21754  ...  United Kingdom
           536367        21755  ...  United Kingdom
           536367        21777  ...  United Kingdom
           536367        48187  ...  United Kingdom
12583.0    536370        22728  ...          France
           536370        22727  ...          France
           536370        22726  ...          France
           536370        21724  ...          France
           536370        21883  ...          France
           536370        10002  ...          France
           536370        21791  ...          France
           536370        21035  ...          France
           536370        22326  ...          France
           536370        22629  ...          France
           536370        22659  ...          France
           536370        22631  ...          France
           536370        22661  ...          France
           536370        21731  ...          France
           536370        22900  ...          France
           536370        21913  ...          France
           536370        22540  ...          France
           536370        22544  ...          France
           536370        22492  ...          France
           536370         POST  ...          France
13748.0    536371        22086  ...  United Kingdom
15100.0    536374        21258  ...  United Kingdom
15291.0    536376        22114  ...  United Kingdom

以上是转到groupby客户ID,不管它在数据中的哪里重复。. 我强调这一点是因为我看到在您的预期输出中,一些客户有多个购买块(即17850.0出现在开头和结尾)。我假设您确实希望将所有客户 ID 组合在一起......保留重复 ID 的块并按它们分组将是一个更复杂的groupby操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在第一个熊猫python上排序时,保持第二级的多索引完整

如何在第二级以下的多索引数据框中删除第一列,排除一些列

在第一级和第二级过滤具有多列索引的数据框

获取带有偏移索引的熊猫数据框中的列的第一个值

为什么此复合二级沙发基准索引仅匹配创建查询中的第一个字段

多索引-为每个第一个索引获取第二个索引的最大值

如何仅从组合框 c# 中获取第一个索引

如何获得数据框匹配中的第一个索引

按级别从多索引分组中获取第一个索引

获取多索引数据框第二级的名称

如何对多索引数据帧的第一个索引执行类似于 group by 的操作

获取第二个系列中第一个系列的元素索引

如何将列表列表隐藏到数据框中并使列表的第一个元素作为索引

在Multiindex数据框中查找每个索引的第一个匹配项

Pandas:在列表的数据框列中索引每个列表的第一个元素

如何在RethinkDB中获取数据库的所有二级索引的列表

获取第一个实例多索引并保留索引值

如何根据第一个的索引和第二个的列值将数据框的所有列值复制到另一个的新列中

如何使用二级索引列表为Pandas数据框建立索引?

如何将列表列表转换为数据框,其中第一个元素是索引,第二个元素是列名

我如何获取数组的返回列表中的第一个索引的值

在第二级熊猫多索引中选择数据框的子集

熊猫将第一个多索引转换为行索引,将第二个多索引转换为列索引

如何从Java文本文件中的特定起始索引获取第一个整数的索引?

如何使用Python Pandas在数据框的最后一列中使用货币格式获取第一个单元格的行索引

如何将两个二维数据框合并到一个多索引的多维熊猫数据框中?

如何从每个第一级索引的最大第二级索引的单元格中选择值?

索引熊猫数据框以返回每天的第一个数据点

根据最后一个二级索引为每个一级索引选择所有行