python - fila - Cómo implementar ''in'' y ''not in'' para el marco de datos de Pandas
eliminar filas dataframe python (5)
Por lo general, he estado filtrando genéricos en filas como esta:
criterion = lambda row: row[''countries''] not in countries
not_in = df[df.apply(criterion, axis=1)]
¿Cómo puedo lograr los equivalentes de SQL IN
y NOT IN
?
Tengo una lista con los valores requeridos. Aquí está el escenario:
df = pd.DataFrame({''countries'':[''US'',''UK'',''Germany'',''China'']})
countries = [''UK'',''China'']
# pseudo-code:
df[df[''countries''] not in countries]
Mi forma actual de hacer esto es la siguiente:
df = pd.DataFrame({''countries'':[''US'',''UK'',''Germany'',''China'']})
countries = pd.DataFrame({''countries'':[''UK'',''China''], ''matched'':True})
# IN
df.merge(countries,how=''inner'',on=''countries'')
# NOT IN
not_in = df.merge(countries,how=''left'',on=''countries'')
not_in = not_in[pd.isnull(not_in[''matched''])]
Pero esto parece un horrible kludge. ¿Alguien puede mejorarlo?
Puede usar pd.Series.isin
.
Para el uso "IN": something.isin(somewhere)
O para "NO ENCENDIDO": ~something.isin(somewhere)
Como un ejemplo trabajado:
>>> df
countries
0 US
1 UK
2 Germany
3 China
>>> countries
[''UK'', ''China'']
>>> df.countries.isin(countries)
0 False
1 True
2 False
3 True
Name: countries, dtype: bool
>>> df[df.countries.isin(countries)]
countries
1 UK
3 China
>>> df[~df.countries.isin(countries)]
countries
0 US
2 Germany
Quería filtrar las filas de dfbc que tenían un BUSINESS_ID que también estaba en BUSINESS_ID de dfProfilesBusIds
Finalmente lo hice funcionar:
dfbc = dfbc[(dfbc[''BUSINESS_ID''].isin(dfProfilesBusIds[''BUSINESS_ID'']) == False)]
Solución alternativa que usa el método .query() :
In [5]: df.query("countries in @countries")
Out[5]:
countries
1 UK
3 China
In [6]: df.query("countries not in @countries")
Out[6]:
countries
0 US
2 Germany
df = pd.DataFrame({''countries'':[''US'',''UK'',''Germany'',''China'']})
countries = [''UK'',''China'']
implementar en :
df[df.countries.isin(countries)]
implementar no en como en los países de descanso:
df[df.countries.isin([x for x in np.unique(df.countries) if x not in countries])]