如果有两个以上的字段为空,则跳过该行

时间:2019-10-04 07:50:19

标签: python pandas dataframe

首先,如果列有多于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

乔治亚州38 41 24 38

哥斯达黎加

4 个答案:

答案 0 :(得分:0)

尝试一下

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

代替代码行

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

答案 1 :(得分:0)

好吧,尝试一下...

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汤姆(Tom)无1 1无无无3 2 40玛丽20 0 3 30简25 0

所以过滤变得容易。...

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

希望有帮助...

答案 2 :(得分:0)

您可以使用.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]

希望这会有所帮助!

答案 3 :(得分:0)

一种简单的方法是在行的基础上比较数据帧的值计数和列数。然后,您可以将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