【问题标题】:Python - Summary Statistics using date and namePython - 使用日期和名称进行汇总统计
【发布时间】:2016-05-02 22:20:13
【问题描述】:

在 python 中,我有时间序列数据。数据的key是日期和名称,数据有4个属性:A、B、C、D。

我需要对这个数据集做一些汇总数据分析:

1) 对于每个名字,A、B、C 和 D 的平均值

2) 对于每个名称,A、B、C 和 D 的标准差

3) 对于每个名称,计算每个 A、B、C 和 D 的 NaN 数量占总数的百分比

我熟悉 R 但不熟悉 python。如果您能指出我正确的方向,那就绰绰有余了!谢谢。

asof_dt = pd.date_range('20151231','20160130')
df1=pd.DataFrame(np.random.randn(len(asof_dt),4),index=asof_dt,columns=('A','B','C','D'))
df1['name']='alpha'
df2=pd.DataFrame(np.random.randn(len(asof_dt),4),index=asof_dt,columns=('A','B','C','D'))
df2['name']='beta'
df3=pd.DataFrame(np.random.randn(len(asof_dt),4),index=asof_dt,columns=('A','B','C','D'))
df3['name']='gama'
df_total = pd.concat([df1,df2,df3])
df_total[['name','A','B','C']]

【问题讨论】:

    标签: python pandas dataframe time-series


    【解决方案1】:

    您正在寻找的是groupBy

    你的例子:

    import pandas as pd
    
    df_total.groupby(['name']).mean()
    df_total.groupby(['name']).std()
    df_total.groupby(['name']).apply(pd.isnull).sum() / df_total.groupBy(['name']).size()
    

    【讨论】:

    • 当我将“groupBy”更改为小写“groupby”时,似乎一切正常。但是,最后一个不起作用:AttributeError: Cannot access callable attribute 'isnull' of 'DataFrameGroupBy' objects, try using the 'apply' method
    • @TrexionKameha:这就是我在不先运行代码的情况下发布代码的结果:)。您可以使用applypandas.isnull 函数来实现相同的效果,请参阅编辑。
    • 要得到% NaN,你应该除以总数(长度),而不是count提供的非Null值的数量。
    • @Alexander Ah,当然。我编辑了答案以改用size,它应该与每个组的len 相同。
    【解决方案2】:

    describe 为您提供了相当多的信息:

    >>> df_total.describe()
    
                   A          B          C          D
    count  93.000000  93.000000  93.000000  93.000000
    mean    0.006006   0.136171   0.024950   0.039227
    std     0.987713   0.996221   1.042611   0.946783
    min    -2.193879  -2.958631  -3.012410  -2.714318
    25%    -0.604479  -0.436393  -0.514906  -0.574699
    50%     0.012784   0.191079   0.062942   0.087534
    75%     0.535302   0.701117   0.666500   0.833580
    max     2.578850   2.483724   2.460043   2.282775
    

    仅获取计数、均值和 SD:

    >>> df_total.groupby('name').apply(lambda group: group.describe().head(3))
    
        A          B          C          D
    name                                                   
    alpha count  31.000000  31.000000  31.000000  31.000000
          mean   -0.076509   0.152993   0.149915   0.180412
          std     1.056520   1.063591   1.010325   0.778637
    beta  count  31.000000  31.000000  31.000000  31.000000
          mean    0.022814   0.247238  -0.006391   0.059466
          std     0.862030   0.870068   1.065224   1.055671
    gama  count  31.000000  31.000000  31.000000  31.000000
          mean    0.071712   0.008283  -0.068673  -0.122199
          std     1.058608   1.060826   1.073273   0.990097
    

    【讨论】:

    • 有没有简单的计算 NaN 的方法?
    • 获取 % NaN:df_total.groupby('name').apply(lambda group: group.isnull().sum().div(len(group)))
    猜你喜欢
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2019-03-19
    • 2021-09-22
    相关资源
    最近更新 更多