Tengo dos marcos de datos como se indica a continuación:

dfA = 
Country      City           Pop
US           Washington     1000
US           Texas          5000
CH           Geneva         500
CH           Zurich         500


dfB = 
Country      City           Density (pop/km2)
US           Washington     10
US           Texas          50
CH           Geneva         5
CH           Zurich         5

Lo que quiero es comparar las columnas Country y City de ambos marcos de datos, y cuando coinciden, como por ejemplo:

US Washington & US Washington en ambos marcos de datos, toma el valor Pop y lo divide por Density, para obtener una nueva columna area en dfB con la división resultante. Ejemplo de resultados de la primera fila dfB['area km2'] = 100

He intentado con np.where() pero no funciona. ¿Alguna pista sobre cómo lograr esto?

2
user143853 4 oct. 2019 a las 19:47

3 respuestas

La mejor respuesta

También puede usar merge para combinar los dos marcos de datos y dividir como de costumbre:

dfMerge = dfA.merge(dfB, on=['Country', 'City'])
dfMerge['area'] = dfMerge['Pop'].div(dfMerge['Density (pop/km2)'])
print(dfMerge)

Salida:

  Country        City   Pop  Density (pop/km2)   area
0      US  Washington  1000                 10  100.0
1      US       Texas  5000                 50  100.0
2      CH      Geneva   500                  5  100.0
3      CH      Zurich   500                  5  100.0
0
Quang Hoang 4 oct. 2019 a las 17:02

Usando coincidencia de índice y div

match_on = ['Country', 'City']
dfA = dfA.set_index(match_on)
dfA.assign(ratio=dfA.Pop.div(df.set_index(['Country', 'City'])['Density (pop/km2)']))

Country  City      
US       Washington    100.0
         Texas         100.0
CH       Geneva        100.0
         Zurich        100.0
dtype: float64
2
rafaelc 4 oct. 2019 a las 17:13

También puedes usar fusionar como a continuación

dfB["Area"] = dfB.merge(dfA, on=["Country", "City"], how="left")["Pop"] / dfB["Density (pop/km2)"]
dfB
0
Dev Khadka 4 oct. 2019 a las 17:01
58240371