首先,如果列有多于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
哥斯达黎加
答案 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