【问题标题】:Number of non-missing values in array? Len(x) excluding missing values?数组中非缺失值的数量? Len(x) 排除缺失值?
【发布时间】:2014-06-03 02:41:12
【问题描述】:

python中是否有一个函数可以让我计算数组中非缺失值的数量?

我的数据:

df.wealth1[df.wealth < 25000] = df.wealth
df.wealth2[df.wealth <50000 & df.wealth > 25000] = df.wealth
df.wealth3[df.wealth < 75000 & df.wealth > 50000] = df.wealth
...

id, income, wealth, wealth1, wealth2, ... wealth9
1, 100000, 20000, 20000, ,...,
2, 60000, 40000, , 40000, ...,
3 70000, 23000, 23000, , ...,
4 80000, 75000, , ,..., 75000
...

我现在的情况:

income_brackets = [(0, 25000), (25000,50000), (50000,100000)]
source = {'wealth1': [], 'wealth2' :[], .... 'wealth9' : []

for lower, upper in income_brackets:
for key in source:
source[key].append(len(df.query('income > {} and income < {}'.format(lower,upper))[np.logical_not(np.isnan([key]))]))

但这不起作用,因为np.isnan('wealth1') 无效。它仅适用于np.isnan(df.wealth1),但我无法将其合并到我的 for 循环中。我对 python 很陌生,所以也许(希望)我遗漏了一些明显的东西。

任何建议或问题都会很棒。谢谢!干杯

【问题讨论】:

    标签: python for-loop count pandas missing-data


    【解决方案1】:

    最好的方法是使用DataFrame对象的count方法:

    In [18]: data = randn(1000, 3)
    
    In [19]: data
    Out[19]:
    array([[ 0.1035,  0.9239,  0.3902],
           [ 0.2022, -0.1755, -0.4633],
           [ 0.0595, -1.3779, -1.1187],
           ...,
           [ 1.3931,  0.4087,  2.348 ],
           [ 1.2746, -0.6431,  0.0707],
           [-1.1062,  1.3949,  0.3065]])
    
    In [20]: data[rand(len(data)) > 0.5] = nan
    
    In [21]: data
    Out[21]:
    array([[ 0.1035,  0.9239,  0.3902],
           [ 0.2022, -0.1755, -0.4633],
           [    nan,     nan,     nan],
           ...,
           [ 1.3931,  0.4087,  2.348 ],
           [ 1.2746, -0.6431,  0.0707],
           [-1.1062,  1.3949,  0.3065]])
    
    In [22]: df = DataFrame(data, columns=list('abc'))
    
    In [23]: df.head()
    Out[23]:
            a       b       c
    0  0.1035  0.9239  0.3902
    1  0.2022 -0.1755 -0.4633
    2     NaN     NaN     NaN
    3     NaN     NaN     NaN
    4     NaN     NaN     NaN
    
    [5 rows x 3 columns]
    
    In [24]: df.count()
    Out[24]:
    a    498
    b    498
    c    498
    dtype: int64
    
    In [26]: df.notnull().sum()
    Out[26]:
    a    498
    b    498
    c    498
    dtype: int64
    

    像许多 pandas 方法一样,这也适用于 Series 对象:

    In [27]: df.a.count()
    Out[27]: 498
    

    【讨论】:

    • 非常感谢您通知我有关该功能的信息!我尝试寻找计数功能,但由于某种原因(我一定是盲人)找不到它。效果很好。
    • 您对如何将其包含在我的 df.query 和 for 循环中有何建议?我遇到了麻烦:source[key].append(pd.DataFrame(df.query('income &gt; {} and income &lt; {}'.format(lower,upper))[key]).count())
    • 问题是source['wealth1'][0] 返回wealth1 725 dtype: int64 而不仅仅是725
    • 更新:使用source[key].append(pd.DataFrame(df.query('income &gt; {} and income &lt; {}'.format(lower,upper))[key]).count()[0])
    【解决方案2】:

    Pandas 也允许您通过以下方式访问列:

    np.isnan(df['wealth1'])
    

    顺便说一句,即使不是这样,你仍然可以这样做

    np.isnan(getattr(df, 'wealth1'))
    

    【讨论】:

    • 太好了,谢谢。很高兴知道我可以访问这些方法中的列。
    • 我可以接受两个答案吗?这个答案效果很好 - 但我认为另一个答案更好地解决了问题的标题。
    • 不,不是。我只回复了“我遗漏了一些明显的东西”部分;-)
    猜你喜欢
    • 2020-11-14
    • 2021-02-10
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多