ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python Pandas-构造多元数据透视表以显示NaN和非NaN的计数

2019-11-18 10:56:22  阅读:651  来源: 互联网

标签:pandas dataframe nan pivot-table python


我有一个基于不同气象站的数据集,其中包含多个变量(温度,压力等),

stationID | Time | Temperature | Pressure |...
----------+------+-------------+----------+
123       |  1   |     30      |  1010.5  |   
123       |  2   |     31      |  1009.0  |
202       |  1   |     24      |  NaN     |
202       |  2   |     24.3    |  NaN     |
202       |  3   |     NaN     |  1000.3  |
...

并且我想创建一个数据透视表,以显示每个气象站的NaN和非NaN数量,例如:

stationID | nanStatus | Temperature | Pressure |...
----------+-----------+-------------+----------+
123       |  NaN      |      0      |     0    |       
          |  nonNaN   |      2      |     2    |
202       |  NaN      |      1      |     2    |
          |  nonNaN   |      2      |     1    |
...

在下面,我显示了我到目前为止所做的事情,这对于Temperature来说(很麻烦).但是,如何使两个变量都一样,如上所示?

import pandas as pd
import bumpy as np
df = pd.DataFrame({'stationID':[123,123,202,202,202], 'Time':[1,2,1,2,3],'Temperature':[30,31,24,24.3,np.nan],'Pressure':[1010.5,1009.0,np.nan,np.nan,1000.3]})

dfnull = df.isnull()
dfnull['stationID'] = df['stationID']
dfnull['tempValue'] = df['Temperature']
dfnull.pivot_table(values=["tempValue"], index=["stationID","Temperature"], aggfunc=len,fill_value=0)

输出为:

----------------------------------
                         tempValue
stationID | Temperature           
123       | False                2
202       | False                2
          | True                 1

解决方法:

更新:感谢@root

In [16]: df.groupby('stationID')[['Temperature','Pressure']].agg([nans, notnans]).astype(int).stack(level=1)
Out[16]:
                   Temperature  Pressure
stationID
123       nans               0         0
          notnans            2         2
202       nans               1         2
          notnans            2         1

原始答案:

In [12]: %paste
def nans(s):
    return s.isnull().sum()

def notnans(s):
    return s.notnull().sum()
## -- End pasted text --

In [37]: df.groupby('stationID')[['Temperature','Pressure']].agg([nans, notnans]).astype(np.int8)
Out[37]:
          Temperature         Pressure
                 nans notnans     nans notnans
stationID
123                 0       2        0       2
202                 1       2        2       1

标签:pandas,dataframe,nan,pivot-table,python
来源: https://codeday.me/bug/20191118/2027620.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有