在 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
抱歉,如果这听起来像是一个愚蠢的问题,我是 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