在 Pandas 中,如何为另一列中的最大值创建一个 table 对应列值的数据透视表 table?

In Pandas, how can I create a pivot table that returns corresponding column value, for a max in another column?

抱歉,如果这听起来像是一个愚蠢的问题,我是 python 和 pandas 的新手,而且我一直在使用枢轴 table 时遇到问题。任何帮助将不胜感激。

我有一个如下所示的文件:

Idx State Sex  Year    Name  Count
0    GA   F  1910    Mary    841
1    GA   F  1910   Annie    553
2    GA   F  1910  Mattie    320
3    GA   F  1910    Ruby    279
4    GA   F  1910  Willie    275
5    GA   F  1910  Louise    231

我想创建一个数据透视表 table,其中 returns 一列连续的年份 [每行一行],以及具有最高计数的名称列,以及显示最大值的计数列,例如

Year    Name  Count
1910    Mary    1841
1911    Paul    553
1912   June     9620

我试过:

import pandas as pd
bn = pd.read_csv("baby_names.csv")
bn['Count'].astype(int)
by_yr = pd.pivot_table(data=bn, values="Count", index=['Year','Name'], aggfunc='max' )
print(by_yr.head(10))

以及:

import pandas as pd
bn = pd.read_csv("baby_names.csv")
bn['Count'].astype(int)
by_yr = pd.pivot_table(data=bn, values=['Name',"Count"], index='Year', aggfunc='max' )
print(by_yr.head(10))

但它们都不起作用。我确定我遗漏了一些愚蠢的东西,但我们将不胜感激。谢谢

您可以使用 groupby('Year')nlargest 为每个 group/year 查找最大值 Count 的行。

step1 = df.groupby('Year').apply(lambda df: df.nlargest(1, 'Count'))

然后使用

处理格式
step1.droplevel(1, axis=0)[['Name', 'Count']].reset_index()

试试这个:

我扩展了您的数据框示例,以便我们能够更好地验证结果:

df = pd.DataFrame({0:[0,'GA','F','1910','Mary',841],
                   1:[1,'GA','F','1910','Annie',553],
                   2:[2,'GA','F','1910','Mattie',320],
                   3:[3,'GA','F','1910','Ruby',279],
                   4:[4,'GA','F','1910','Willie',275],
                   5:[5,'GA','F','1910','Louise',231],
                   6:[6,'GA','M','1911','Paul',234],
                   7:[7,'GA','F','1911','Mattie',745],
                   8:[8,'GA','M','1911','Paul',654],
                   9:[9,'GA','M','1911','Paul',105],
                  10:[10,'GA','F','1911','Louise',76],
                  11:[11,'GA','M','1911','Ringo',894],
                  12:[12,'GA','F','1912','Louise',436],
                  13:[13,'GA','M','1912','Ringo',354],
                  14:[14,'GA','F','1912','Louise',654],
                  15:[15,'GA','F','1912','Ruby',325],
                  16:[16,'GA','M','1912','Ringo',846],
                  17:[17,'GA','F','1912','Louise',100],
                  18:[17,'GA','F','1912','Louise',98]}, 
               index=['Idx','State','Sex','Year','Name','Count']).T

输出:df>>>

  Idx   State   Sex   Year    Name  Count
0   0      GA     F   1910    Mary    841
1   1      GA     F   1910   Annie    553
2   2      GA     F   1910  Mattie    320
3   3      GA     F   1910    Ruby    279
4   4      GA     F   1910  Willie    275
5   5      GA     F   1910  Louise    231
6   6      GA     M   1911    Paul    234
7   7      GA     F   1911  Mattie    745
8   8      GA     M   1911    Paul    654
9   9      GA     M   1911    Paul    105
10  10     GA     F   1911  Louise     76
11  11     GA     M   1911   Ringo    894
12  12     GA     F   1912  Louise    436
13  13     GA     M   1912   Ringo    354
14  14     GA     F   1912  Louise    654
15  15     GA     F   1912    Ruby    325
16  16     GA     M   1912   Ringo    846
17  17     GA     F   1912  Louise    100
18  17     GA     F   1912  Louise     98

首先确保 'Count' 行是数字,方法是:

df['Count'] = pd.to_numeric(df['Count'])

然后就这样做:

df[['Year','Name','Count']].loc[df.groupby('Year')['Count'].idxmax()]

输出:df>>

    Year     Name   Count
0   1910     Mary     841
11  1911    Ringo     894
16  1912    Ringo     846