在groupby之后选择不同的列

时间:2017-09-15 23:25:10

标签: pandas max loc

我是熊猫的新手,所以请耐心地对待这个问题 我有一个Df,其中包含多年来在多个州收集的年份,州和人口数据

我想找到任何一年中的最大弹出和相应的状态

示例:

1995 Alabama xx; 1196 New York yy; 1997 Utah zz

我做了一个小组,并在一年内获得了所有州的人口;我如何迭代这些年

state_yearwise = df.groupby(["Year", "State"])["Pop"].max()
state_yearwise.head(10)
1990  Alabama        22.5
      Arizona        29.4
      Arkansas       16.2
      California     34.1

2016 South Dakota     14.1
     Tennessee        10.2
     Texas            17.4
     Utah             16.1

现在我做了

df.loc[df.pop  == df.pop.max(), ["year", "State", "pop"]]

1992    Colorado  54.1

只给我1年和最多的年份和状态 我想要的是每年哪个州有最大人口

建议?

3 个答案:

答案 0 :(得分:2)

您可以使用transform获取每列的最大值并获取相应pop的索引

idx = df.groupby(['year'])['pop'].transform(max) == df['pop']

现在您可以使用idx索引df

df[idx]

你得到了

    pop state   year
2   210 B   2000
3   200 B   2001

对于您更新的其他数据框

    Year    State       County  Pop
0   2015    Mississippi Panola  6.4
1   2015    Mississippi Newton  6.7
2   2015    Mississippi Newton  6.7
3   2015    Utah        Monroe  12.1
4   2013    Alabama     Newton  10.4
5   2013    Alabama     Georgi  4.2

idx = df.groupby(['Year'])['Pop'].transform(max) == df['Pop']

df[idx]

你得到了

    Year    State   County  Pop
3   2015    Utah    Monroe  12.1
4   2013    Alabama Newton  10.4

答案 1 :(得分:1)

这就是你想要的:

df = pd.DataFrame([{'state' : 'A', 'year' : 2000, 'pop' : 100},
    {'state' : 'A', 'year' : 2001, 'pop' : 110},
    {'state' : 'B', 'year' : 2000, 'pop' : 210},
    {'state' : 'B', 'year' : 2001, 'pop' : 200}])
maxpop = df.groupby("state",as_index=False)["pop"].max()
pd.merge(maxpop,df,how='inner')

我看到df

    pop state year
0   100 A     2000
1   110 A     2001
2   210 B     2000
3   200 B     2001

最终结果:

  state pop year
0   A   110 2001
1   B   210 2000

证明这有效:

enter image description here

答案 2 :(得分:1)

为什么不摆脱群体?使用sort_valuesdrop_duplicates

df.sort_values(['state','pop']).drop_duplicates('state',keep='last')
Out[164]: 
   pop state  year
1  110     A  2001
2  210     B  2000