Aquí está mi marco de datos de entrada
df = pd.DataFrame([ ['CA', 'LAX', 'Alice'], ['NY', 'NYC', 'Alice'], ['TX', 'HOU', 'Alice'], ['CA', 'SFO', 'Bob'], ['NY', 'NYC', 'Bob'], ['TX', 'AUS', 'Bob'], ['CA', 'LAX', 'Carol'], ['NY', 'ALB', 'Carol'], ['TX', 'HOU', 'Carol'], ['CA', 'LAX', 'Dan'], ['NY', 'NYC', 'Dan'], ['TX', 'DAL', 'Dan'], ['CA', 'SFO', 'Eve'], ['NY', 'NYC', 'Eve'], ['TX', 'AUS', 'Eve'], ['CA', 'SDO', 'Frank'], ['NY', 'NYC', 'Frank'], ['TX', 'HOU', 'Frank']], columns=['State','City','Person'])Y aquí está la salida que deseo obtener:
State City Count CA LAX 3 SFO 2 NY ALB 1 NYC 5 TX HOU 3 AUS 2Básicamente, quiero mostrar las 2 ciudades principales que tienen el mayor número de personas, para cada estado.
He intentado usar esta instrucción groupby: df.groupby(['State','City'])['Person'].count()
que genera debajo de la salida
State City CA LAX 3 SDO 1 SFO 2 NY ALB 1 NYC 5 TX AUS 2 DAL 1 HOU 3Pero no puedo encontrar declaraciones que puedan ordenar los recuentos anteriores y elegir los dos recuentos más altos. Realmente apreciaría la ayuda!
Creo que puedes simplificar el enfoque.
Puede usar groupby.value_counts() , en lugar de count() , para llegar a donde está y luego encadenar otro groupby().head(2) para obtener las 2 ciudades principales de cada estado.
La razón es que el objeto resultante de value_counts() estará en orden descending , de modo que el primer elemento es el elemento que ocurre con más frecuencia, por lo que puede usar head(2) tal como está.
df.groupby('State')['City'].value_counts().groupby('State').head(2) State City CA LAX 3 SFO 2 NY NYC 5 ALB 1 TX HOU 3 AUS 2 Name: City, dtype: int64Su primer grupo fue correcto, después de eso desea ordenar sus valores según el estado y el recuento.
Luego, vuelve a agrupar únicamente en el estado y busca la cabeza (2). Si lo desea, puede (re)establecer su índice en Estado y ciudad.
df2 = df.groupby(['State','City'])['Person'].count().to_frame('Count') df2 = df2.reset_index().sort_values(['State', 'Count'], ascending=[True, False]) df2.groupby('State').head(2).set_index(['State','City'])Producción:
Count State City CA LAX 3 SFO 2 NY NYC 5 ALB 1 TX HOU 3 AUS 2