在Pandas數據框中只保留非零缺失值

2024-04-25 18:27:23 发布

您现在位置:Python中文网/ 问答频道 /正文

如何从数据帧中按降序仅选择非空列。你知道吗

以下是数据帧:

df = pd.DataFrame( { 'a': [1,2,np.nan,np.nan],
                    'b':  [10,20,30,40],
                   'c': [1,np.nan,np.nan,np.nan]})
     a   b    c
0  1.0  10  1.0
1  2.0  20  NaN
2  NaN  30  NaN
3  NaN  40  NaN

我可以做到:

df.isnull().sum().sort_values(ascending=False)
c    3
a    2
b    0

但我想将多个命令链接到一行中,以便在一行中给出结果。你知道吗

我试过: df.isnull().sum().sort_values(ascending=False).filter(lambda x: x>0) 它失败了

我知道这一点:

temp = df.isnull().sum().sort_values(ascending=False)
temp[temp>0]
c    3
a    2

但我正在寻找一种方法,以链接在一行继续。你知道吗

要求:

df.isnull().sum().sort_values(ascending=False).somefunction( x > 0)

更新
我找到了一种将序列转换为数据帧,然后使用查询的方法。你知道吗

df.isnull().sum().sort_values(ascending=False).to_frame().rename(columns={0:'temp'}).query("temp > 0")

这看起来又长又多余。有更好的办法吗?你知道吗


Tags: 数据方法falsedf链接npnansort
3条回答

当然,有很多方法可以做到这一点,但一般来说,我不建议在传递python函数时使用lambda或过滤器,因为如果您的序列较大,这将使事情变得相当缓慢。 在你的情况下,你可以这样做 1用nan替换0并删除nan。你知道吗

df.isnull().sum().replace(0, np.nan).dropna().sort_values(ascending=False).astype(int)

这样做的缺点是需要输入convert两次(nan总是一个float,而不是int)。 2使用查询功能。你知道吗

df.isnull().sum().sort_values(ascending=False).to_frame('value').query('value!=0')['value'].rename(None)

这种方法的缺点是它只存在于数据帧上,因此需要先将序列转换为一个序列。但是,对于大型系列,这应该比类型转换便宜,因为基础数组保持不变。你知道吗

通过isnaanyaxis=0的掩码使用.loc

df.loc[:, df.isna().any()].isna().sum().sort_values(ascending=False)

Out[1845]:
c    3
a    2
dtype: int64

这对于filter来说是混淆的,因为它是用于索引的,而不是值

df.isnull().sum().loc[lambda x : x>0].sort_values(ascending=False)
Out[147]: 
a    2
c    3
dtype: int64

相关问题 更多 >