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
min
和 max
等操作也将使用分类排序来确定输出:
df.groupby('Acct Number').agg({'Code': ['min', 'max']})
Code
min max
Acct Number
1011 DEF JKL
1012 DEF JKL
我有一个数据集,其中有几千条记录。列是帐户号、代码、数据。
如果它们具有相同的帐号(第 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
min
和 max
等操作也将使用分类排序来确定输出:
df.groupby('Acct Number').agg({'Code': ['min', 'max']})
Code
min max
Acct Number
1011 DEF JKL
1012 DEF JKL