Pandas Python groupby multiple columns - 根据具有特定值的第一列,按第二列中的值对行进行排序

Pandas Python groupby multiple columns - sort rows by values in column 2 based on column one having a specific value

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

如果它们具有相同的帐号(第 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'])

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

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

我想试试这样的东西。

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() 中用于识别我想要的特定顺序的语法(如果它设置在已经首先按不同列排序的索引中)。

非常感谢所有帮助!!

更新:截至 3:28PM 太平洋时间 07/02/21 我发现了这个问题:

Question #23279238 - Custom Dictionary

您链接的最后一个问题使您的问题更清楚了。创建一个 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

假设代码有一个既定的顺序,并且它们的有序性质将需要在未来的操作中使用或重复使用,创建一个 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