Primero, omita la fila de datos si las columnas tienen más de 2 columnas que están vacías. Después de este paso, las filas con más de 2 columnas de valor perdido se filtrarán.

Entonces, como algunas de las columnas todavía tienen 1 o 2 columnas están vacías. Así que completaré la columna vacía con el valor medio de esa fila.

Puedo ejecutar el segundo paso con mi código a continuación, sin embargo, no estoy seguro de cómo filtrar las filas con más de 2 columnas de valor perdido.

Intenté usar dropna pero eliminó todas las columnas de la tabla.

Mi código:

import numpy as np
import pandas as pd

import matplotlib 
import matplotlib.pyplot as pp

%matplotlib inline

# high technology exports percentage of manufatory exports
hightech_export = pd.read_csv('hightech_export_1.csv') 

#skip the row of data if the columns have more than 2 columns are empty
hightech_export.dropna(axis=1, how='any', thresh=2, subset=None, inplace=False)

# Fill in data with mean value. 
m = hightech_export.mean(axis=1)
for i, col in enumerate(hightech_export):
    hightech_export.iloc[:, i] = hightech_export.iloc[:, i].fillna(m)

Mi conjunto de datos:

Nombre del país 2001 2002 2003 2004

Filipinas 71

Malta 62 58 60 58

Singapur 60 56

Malasia 58 57 55

Irlanda 47 41 34 34

Georgia 38 41 24 38

Costa Rica

0
codegekJohn 4 oct. 2019 a las 10:50

4 respuestas

La mejor respuesta

Puede utilizar el método .isnull() para realizar su primera tarea como se muestra a continuación:

Reemplazar esto

hightech_export.dropna(axis=1, how='any', thresh=2, subset=None, inplace=False)

Con

hightech_export= hightech_export.loc[hightech_export.isnull().sum(axis=1)<=2]

¡Espero que esto ayude!

0
Parthasarathy Subburaj 4 oct. 2019 a las 08:36

Una manera simple es comparar en una fila el recuento de valor y el número de columnas del marco de datos. Luego puede reemplazar NaN con el promedio del marco de datos.

El código podría ser:

result = df.loc[df.apply(lambda x: x.count(), axis=1) >= (len(df.columns) - 2)].replace(
             np.nan, df.agg('mean'))

Con sus datos de ejemplo, da como se esperaba:

  Country Name  2001   2002       2003  2004
1        Malta  62.0  58.00  60.000000  58.0
2    Singapore  60.0  49.25  39.333333  56.0
3     Malaysia  58.0  57.00  39.333333  55.0
4      Ireland  47.0  41.00  34.000000  34.0
5      Georgia  38.0  41.00  24.000000  38.0
0
Serge Ballesta 4 oct. 2019 a las 08:47

Ok prueba esto ...

import pandas as pd
import numpy as np

data1={'Name':['Tom',np.NaN,'Mary','Jane'],'Age':[20,np.NaN,40,30],'Pay':[np.NaN,np.NaN,20,25]}
data2={'Name':['Tom','Bob','Mary'],'Age':[40,30,20]}

df1=pd.DataFrame.from_records(data1)

Comprueba el df

Df1

    Age Name    Pay
0   20.0    Tom NaN
1   NaN NaN NaN
2   40.0    Mary    20.0
3   30.0    Jane    25.0

El registro con índice 1 tiene 3 valores faltantes ...

Reemplazar y hacer valores faltantes Ninguno

df1 = df1.replace({pd.np.nan: None})

Ahora escriba la función para contar los valores faltantes por fila ... y para crear una lista

def count_na(lst):
    missing = [n for n in lst if not n]
    return len(missing)

missing_data=[]
for index,n in df1.iterrows():
    missing_data.append(count_na(list(n)))

Use esta lista como una nueva columna en el marco de datos

df1['missing']=missing_data

Df1 debería verse así

Age     Name    Pay    missing

0 20 Tom Ninguno 1 1 Ninguno Ninguno Ninguno 3 2 40 Mary 20 0 3 30 Jane 25 0

Entonces el filtrado se vuelve fácil ...

# Now only take records with <2 missing
df1[df1.missing<2]

Espero que ayude...

0
Tim Seed 4 oct. 2019 a las 08:36

Prueba esto

hightech_export.dropna(thresh=2, inplace=True)

En lugar de la línea de código

hightech_export.dropna(axis=1, how='any', thresh=2, subset=None, inplace=False)
0
Danoram 4 oct. 2019 a las 10:06
58232062