在删除NaN之后如何找到最大的数据框?
例如,假设我有一个(10,4)数据帧,上面有一些NaN。如果我使用其默认参数调用dropna,它将删除所有具有NaN的所有行,并以(2,4)df结尾。相反,如果我决定按axis =列放置,我将得到一个(10,2)df,比上一个大。
最后,我可以选择删除具有特定阈值(即最小数量的值)的列,然后删除仍然缺少值的行,在这种情况下,以(8,3)df结尾,将是最大的示例。
是否有一种算法来确定要应用于行/列的阈值,以便在删除所有NaN值之后获得最大的数据帧?
答案 0 :(得分:0)
这是一种方法。说你有:
df = pd.DataFrame({'a':[1,np.nan,np.nan,4,np.nan,np.nan,7,np.nan,9,np.nan],
'b': [11,12,np.nan,np.nan,15,np.nan,17,18,19, 20]})
您可以使用此类:
class opt_nan_drop:
def __init__(self, df):
self.df = df
self.shapes = []
self.nans = self.df.isna().sum()
self.it = np.arange(0, self.nans.max() + 1)
def opt_threshold(self):
for n in self.it:
c = self.nans < n
self.shapes += [self.df.loc[:,c].dropna().size]
self.thr = self.it[np.argmax(self.shapes)]
return self.thr
def final_df(self):
c = self.nans < self.thr
return self.df.loc[:,c].dropna()
用例:
c = opt_nan_drop(df)
opt_threshold()
#4
因此,最佳阈值为4
。并获得具有最佳尺寸的数据框:
c.final_df()
b
0 11.0
1 12.0
4 15.0
6 17.0
7 18.0
8 19.0
9 20.0
说明
此功能针对n
执行以下步骤,直到dataframe列中出现的NaN
数量最多。举例说,在特定的迭代n = 2
上。在这种情况下,如果给定列中的NaN
比n
多,它将被删除。超过阈值的列可以通过以下方式获取:
c = df.isna().sum() < n
#print(c)
#a False
#b True
#dtype: bool
然后在df
上执行布尔索引,然后是dropna()
和size
,以保持缩小的数据帧的尺寸:
df = df.loc[:,c].dropna().size
#10
每次迭代的大小都会添加到列表中,最后it[np.argmax(shapes)]
将保留n
,以使最终数据帧的形状最大化。