【问题标题】:Pandas Python groupby multiple columns - sort rows by values in column 2 based on column one having a specific valuePandas Python groupby多列 - 根据具有特定值的第一列按第2列中的值对行进行排序
【发布时间】:2021-09-14 19:04:32
【问题描述】:

我有一个数据集,其中有几千条记录。列是帐号、代码、数据。

如果它们具有相同的帐户编号(第 1 列),我需要根据代码(第 2 列)对整行进行排序。所以像这样。

 df = DataFrame({'Acct Number':[1011,1011,1011,1011,1012,1012,1012,1012,1012],
                 'Code':['GHI','JKL','ABC','DEF','DEF','MNO','JKL','GHI','ABC'],
                 'Data':['text3','text4','text1','text2','text2','text5','text4','text3','text1'])

我需要知道如何制作如下所示的数据框:

df = DataFrame({'Acct Number':[1011,1011,1011,1011,1012,1012,1012,1012,1012],
                'Code':['ABC','DEF','GHI','JKL','ABC','DEF','GHI','JKL','MNO'],
                'Data':['text1','text2','text3','text4','text1','text2','text3','text4','text5'])

代码(column2)不按字母顺序排列 - 它们是随机字母,因此我无法使用基本排序来按顺序排列这些行。

我正在尝试使用 set_index() 来研究 groupby() 就像在这个问题中一样:

Question #66650446 - Pandas Groupby based on multiple columns

我正在尝试这样的事情。

import pandas as pd

THEFILE = 'original csv file'
THENEWFILE = 'the new csv file'

df = pd.read_csv('THEFILE')
df = df.set_index(['acct_number',df.groupby('code':'CFV','VFC','GTF','EDD','TGY'])
df = df.to_csv(THENEWFILE)

如果 groupby() 中的语法设置在一个已经先按不同列排序的索引中,我不确定它用于识别我想要的特定顺序。

非常感谢所有帮助!

更新:截至 21 年 7 月 2 日太平洋时间下午 3:28,我发现了这个问题:

Question #23279238 - Custom Dictionary

【问题讨论】:

  • 我试图传达 column2 中的值不是按字母顺序排列的,但我需要将它们按特定顺序排列。我认为现在我正在阅读更多@DavidErickson,自定义词典会做到这一点

标签: python-3.x pandas dataframe indexing concatenation


【解决方案1】:

您链接的最后一个问题使您的问题更加清晰。创建一个Order 列,按它排序,然后删除它。您可以确定字典中的顺序。

df = pd.DataFrame({'Acct Number':[1011,1011,1011,1011,1012,1012,1012,1012,1012],
                 'Code':['GHI','JKL','ABC','DEF','DEF','MNO','JKL','GHI','ABC'],
                 'Data':['text3','text4','text1','text2','text2','text5','text4','text3','text1']})
dct = {'ABC' : 0, 'DEF' : 1, 'GHI' : 2, 'JKL' : 3, 'MNO' : 4}  
df['Order'] = df['Code'].map(dct)
df = df.sort_values(['Acct Number', 'Order']).drop('Order', axis=1)
df
Out[1]: 
   Acct Number Code   Data
2         1011  ABC  text1
3         1011  DEF  text2
0         1011  GHI  text3
1         1011  JKL  text4
8         1012  ABC  text1
4         1012  DEF  text2
7         1012  GHI  text3
6         1012  JKL  text4
5         1012  MNO  text5

【讨论】:

    【解决方案2】:

    假设代码有一个既定的顺序,并且它们的有序性质需要在未来的操作中使用或重用,创建CategoricalDtype 可能是有益的:

    # Changed the order slightly so it's not alphabetical
    cat_type = pd.CategoricalDtype(['DEF', 'ABC', 'GHI', 'MNO', 'JKL'],
                                   ordered=True)
    # Convert Code Column to new CategoricalDtype
    df['Code'] = df['Code'].astype(cat_type)
    

    Categorical 现在对于任意数量的操作都将按预期运行,不仅sort_values 将按预期运行,而无需额外的列:

    df = df.sort_values(['Acct Number', 'Code'])
    

    df:

       Acct Number Code   Data
    3         1011  DEF  text2
    2         1011  ABC  text1
    0         1011  GHI  text3
    1         1011  JKL  text4
    4         1012  DEF  text2
    8         1012  ABC  text1
    7         1012  GHI  text3
    5         1012  MNO  text5
    6         1012  JKL  text4
    

    minmax 之类的操作也将使用分类排序来确定输出:

    df.groupby('Acct Number').agg({'Code': ['min', 'max']})
    
                Code     
                 min  max
    Acct Number          
    1011         DEF  JKL
    1012         DEF  JKL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      相关资源
      最近更新 更多