Пропуск строки, если есть более 2 полей, пустые - PullRequest
0 голосов
/ 04 октября 2019

Сначала пропустите строку данных, если столбцы имеют более 2 пустых столбцов. После этого шага строки с пропущенным значением более 2 столбцов будут отфильтрованы.

Затем, поскольку в некоторых столбцах по-прежнему есть 1 или 2 столбца, они пусты. Поэтому я заполню пустой столбец средним значением этой строки.

Я могу выполнить второй шаг с кодом ниже, однако я не уверен, как отфильтровать строки с пропущенным значением более чем в 2 столбцах.

Я попытался использовать dropnaно он удалил все столбцы таблицы.

Мой код:

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)

Мой набор данных:

Название страны 2001 2002 2003 2004

Филиппины71

Мальта 62 58 60 58

Сингапур 60 56

Малайзия 58 57 55

Ирландия 47 41 34 34

Грузия 3841 24 38

Коста-Рика

Ответы [ 4 ]

0 голосов
/ 04 октября 2019

Простой способ состоит в том, чтобы сравнить на основе строки количество значений и количество столбцов в кадре данных. Затем вы можете просто заменить NaN на среднее значение для фрейма данных.

Код может быть:

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

С вашими данными в качестве примера вы получите, как и ожидалось:

  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 голосов
/ 04 октября 2019

Хорошо, попробуйте это ...

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)

Проверьте 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

запись с индексом 1 имеет 3 пропущенных значения ...

Заменить и сделать пропущенные значения Нет

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

Теперь напишите функцию для подсчета пропущенных значений в строке .... и для создания списка

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)))

Используйте этот список какновый столбец в кадре данных

df1['missing']=missing_data

df1 должен выглядеть следующим образом

Age     Name    Pay    missing

0 20 Том Нет 1 1 Нет Нет Нет 3 2 40 Мэри 20 0 3 30 Джейн 25 0

Таким образом, фильтрация становится легкой ....

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

Надеюсь, это поможет ...

0 голосов
/ 04 октября 2019

Вы можете использовать метод .isnull() для выполнения вашей первой задачи, как показано ниже:

замените это

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

на

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

Надеюсь, что этопомогает!

0 голосов
/ 04 октября 2019

Попробуйте это

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

вместо строки кода

hightech_export.dropna(axis=1, how='any', thresh=2, subset=None, inplace=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...