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

iyfjxgzm  于 2022-12-02  发布在  其他
关注(0)|答案(4)|浏览(187)

首先,如果列中有超过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
爱尔兰47 41 34 34
格鲁吉亚38 41 24 38
哥斯达黎加

wkyowqbh

wkyowqbh1#

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

qni6mghb2#

好吧试试这个...

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]

希望能帮上忙...

idv4meu8

idv4meu83#

一个简单的方法是以行为基础比较 Dataframe 的值计数和列数,然后用 Dataframe 的平均值替换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
uqjltbpv

uqjltbpv4#

试试这个

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

替换代码行

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

相关问题