Python 熊猫数据帧按前N项分组

Python 熊猫数据帧按前N项分组,python,pandas,group-by,pandas-groupby,Python,Pandas,Group By,Pandas Groupby,我有以下格式的熊猫数据帧: df = pd.DataFrame(data={'item_code': ['Item1', 'Item2', 'Item3', 'Item1', 'Item1', 'Item2', 'Item2', 'Item1', 'Item3'], 'dollar_amount': ['200.25', '350.00', '120.00', '400.50', '1001.25', '700.00', '350.00', '200.25', '240.00']

我有以下格式的熊猫数据帧:

df = pd.DataFrame(data={'item_code': ['Item1', 'Item2', 'Item3', 'Item1', 'Item1', 'Item2', 'Item2', 'Item1', 'Item3'],
        'dollar_amount': ['200.25', '350.00', '120.00', '400.50', '1001.25', '700.00', '350.00', '200.25', '240.00'],
        'supplier_code': ['Sup1','Sup1','Sup2','Sup1','Sup1','Sup1','Sup1','Sup2','Sup2']})
这是此数据帧的外观:

    dollar_amount  item_code     supplier_code
0   200.25         Item1         Sup1
1   350.00         Item2         Sup1
2   120.00         Item3         Sup2
3   400.50         Item1         Sup1
4   1001.25        Item1         Sup1
5   700.00         Item2         Sup1
6   350.00         Item2         Sup1
7   200.25         Item1         Sup2
8   240.00         Item3         Sup2
我可以通过以下方法获得前N项的总和,即
dollar\u amount

a = data.groupby('item_code', as_index=False).sum()
cnt_srs = a[['item_code','dollar_amount']].sort_values(by=['dollar_amount'], ascending=False).head(15)
cnt_srs
样本输出前5项(非上述数据):

现在我需要这些项目的
供应商\u代码
s

我可以通过以下方式获得供应商代码及其最常提供的物品:

N = 1
df1 = data.groupby(['supplier_code'])['item_code'].value_counts().groupby('supplier_code').head(N)
df1
样本输出:

supplier_code  item_code
Sup1           Item4      9
Sup2           Item2      21
Sup3           Item1      7
Sup4           Item5      173
Sup5           Item3      1
Sup6           Item6      12
我想获得前N名的物品及其供应商,其中前N名物品由其美元金额的总和决定。

预期输出:

item_code      dollar_amount     SupplierCode
TopItem1       8,776,906.5400    Sup4
TopItem2       2,085,528.8170    Sup1
TopItem3       2,033,746.0500    Sup3
TopItem4       1,635,830.4040    Sup1
TopItem5       1,485,672.4050    Sup2
我想要前N项(以美元金额计算)和相应的供应商代码

非常感谢您迄今为止提供的所有帮助。

您可以使用:

df1 = (df.groupby('item_code', as_index=False)
         .agg({'dollar_amount':'sum', 'supplier_code': 'first'}))
print (df1)
  item_code supplier_code  dollar_amount
0     Item1          Sup1        1802.25
1     Item2          Sup1        1400.00
2     Item3          Sup2         360.00

使用您的示例数据,如果您只需要第一个供应商代码,那么下面就足够了

>>> print(df.groupby('item_code').agg({'dollar_amount':sum, 'supplier_code': lambda curr: curr.iloc[0]}).sort_values('dollar_amount', ascending=False).reset_index())
  item_code  dollar_amount supplier_code
0     Item1        1802.25          Sup1
1     Item2        1400.00          Sup1
2     Item3         360.00          Sup2
重置索引()是可选的。我只是用它来返回一个数据帧

但是如果你需要获得每个项目的顶级供应商代码,那么我认为你需要进行双重分组

>>> print(df.groupby(['item_code', 'supplier_code']).sum().sort_values('dollar_amount', ascending=False).reset_index().groupby('item_code').agg({'dollar_amount':sum, 'supplier_code': lambda curr: curr.iloc[0]}).reset_index())
  item_code  dollar_amount supplier_code
0     Item1        1802.25          Sup1
1     Item2        1400.00          Sup1
2     Item3         360.00          Sup2

我无法理解你想要什么。哪一个是预期的output@Dark我将编辑问题项是否可以有多个供应商代码?@user8505495是。但是只有顶级供应商才足够你能修改代码吗?首先向我们展示一个数据框,然后向我们展示来自另一个数据框的“样本输出前5项(不是上述数据)”,该数据框具有未解释的行索引(
supplier\u code
?或删除行索引,如果不相关)。我们在处理哪些问题?您能给这些名称命名吗,如
df1、df2、df_top5、
或其他什么?每个项目都有一个供应商代码。我想要前N项及其供应商代码。我决定前N个项目的方法是将每个项目的DollarAmount相加。因为每个项目至少有一个供应商,所以列“a”不能有NaN。它必须有该项目的供应商代码。嗯,我在
示例输出中看到问题:
-保证唯一
项目\u代码
?如果不是,它如何匹配?我之所以得到NaN是因为使用了示例数据。您确定第二个元素是NaN吗?我想应该是Sup1。@jezrael它只是一个示例输出。它不代表数据
>>> print(df.groupby(['item_code', 'supplier_code']).sum().sort_values('dollar_amount', ascending=False).reset_index().groupby('item_code').agg({'dollar_amount':sum, 'supplier_code': lambda curr: curr.iloc[0]}).reset_index())
  item_code  dollar_amount supplier_code
0     Item1        1802.25          Sup1
1     Item2        1400.00          Sup1
2     Item3         360.00          Sup2