优化数据帧大小以消除所有NaN

时间:2018-12-20 11:47:22

标签: python pandas

在删除NaN之后如何找到最大的数据框?

例如,假设我有一个(10,4)数据帧,上面有一些NaN。如果我使用其默认参数调用dropna,它将删除所有具有NaN的所有行,并以(2,4)df结尾。相反,如果我决定按axis =列放置,我将得到一个(10,2)df,比上一个大。

最后,我可以选择删除具有特定阈值(即最小数量的值)的列,然后删除仍然缺少值的行,在这种情况下,以(8,3)df结尾,将是最大的示例。

是否有一种算法来确定要应用于行/列的阈值,以便在删除所有NaN值之后获得最大的数据帧?

1 个答案:

答案 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上。在这种情况下,如果给定列中的NaNn多,它将被删除。超过阈值的列可以通过以下方式获取:

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,以使最终数据帧的形状最大化。