0

我一直在使用 pandas 库和交叉表来创建一个频率数据框来处理数据。在我在 csv 中读取的以下代码中,创建一个数据框,然后创建一个交叉表,它是一个频率数据框。然后我得到数据的横截面以提取列和下面的数据。

def dataforgraphs():
    d = readcsv()
    df = DataFrame(d)
    d1=df[1]
    d0=df[0]
    d2=df[2]
    d3=df[3]
    d4=df[4]


    cta = pd.crosstab(d0,[d2,d1,d3],rownames=['Date'],colnames=['RigStat','Prov','Obj'],   margins=False)

    ndfABA= ndf.xs('AB', level='Prov', axis=1)
    ABrigs = ndfAB.xs(['BIT','GAS','OIL'],axis=1)

现在从这里开始,我遇到了无法拉出假设列上的横截面的问题,该列将包括所有没有标签“BIT”、“GAS”或“OIL”的空白值。在 excel 数据透视表中,我可以通过在选择要包含在数据透视表中的列时选中(空白)框来做到这一点。我想在这里做同样的事情来获得所有空白的频率计数。

有什么建议么?

目前我得到以下输出,它只指定了三列和下面的频率。

            OIL   GAS   BIT
Date  
01-01-2007   1     6     3
01-02-2007   2     4     4
01-03-2007   1     6     3
01-04-2007   5     6     4
01-05-2007   1     7     3
01-06-2007   6     6     6
01-07-2007   1     8     3
01-08-2007   5     6     6
01-09-2007   1     6     3
01-10-2007   1     7     3

相反,我想获得以下内容,其中包括所有未列为 OIL、GAS 或 BIT(或就此事项列为任何内容)的空白值的列。

            OIL   GAS   BIT  "blank'
Date  
01-01-2007   1     6     3     10
01-02-2007   2     4     4     11
01-03-2007   1     6     3     12
01-04-2007   5     6     4     10
01-05-2007   1     7     3      1
01-06-2007   6     6     6      4
01-07-2007   1     8     3      5
01-08-2007   5     6     6      2
01-09-2007   1     6     3      5
01-10-2007   1     7     3      2

进入 pandas 交叉表数据框的数据结构如下:

Date         Obj  Operator  Type  Address
01-01-2007   OIL   ABC      HZ    112 W Ave
01-01-2007   GAS   ABC      HZ    112 W Ave
01-01-2007   GAS   ABV      HZ    113 W Ave
01-01-2007   BIT   NCH      HZ    114 W Ave
01-01-2007         CNR      HZ    115 W Ave
01-02-2007   OIL   CNRL     HZ    112 W Ave
01-02-2007   OIL   CNRL     HZ    112 W Ave
01-02-2007   OIL   CNRL     HZ    112 W Ave
01-03-2007         CNRL     HZ    112 W Ave
01-03-2007         CNRL     HZ    112 W Ave

从这里开始,pandas 交叉表将创建一个频率表,该表将按日期捕获 OIL、GAS、BIT 的频率,但我找不到如何获取空白值计数。注意有些列没有列出 Obj。这些是我希望能够查询的交叉表中未捕获的值。

有什么建议么?

4

1 回答 1

3

一种可能性是用所需的字符串(例如“空白”)填充 NaN 值,因此它们也被计算在内:

In [23]: df
Out[23]: 
         Date  Obj Operator Type    Address
0  01-01-2007  OIL      ABC   HZ  112 W Ave
1  01-01-2007  GAS      ABC   HZ  112 W Ave
2  01-01-2007  GAS      ABV   HZ  113 W Ave
3  01-01-2007  BIT      NCH   HZ  114 W Ave
4  01-01-2007  NaN      CNR   HZ  115 W Ave
5  01-02-2007  OIL     CNRL   HZ  112 W Ave
6  01-02-2007  OIL     CNRL   HZ  112 W Ave
7  01-02-2007  OIL     CNRL   HZ  112 W Ave
8  01-03-2007  NaN     CNRL   HZ  112 W Ave
9  01-03-2007  NaN     CNRL   HZ  112 W Ave

In [24]: pd.crosstab(df['Date'], df['Obj'])
Out[24]: 
Obj         BIT  GAS  OIL
Date                     
01-01-2007    1    2    1
01-02-2007    0    0    3

In [25]: df2 = df.fillna('blank')

In [26]: pd.crosstab(df2['Date'], df2['Obj'])
Out[26]: 
Obj         BIT  GAS  OIL  blank
Date                            
01-01-2007    1    2    1      1
01-02-2007    0    0    3      0
01-03-2007    0    0    0      2

交叉表实际上所做的只是按您提供的行和列值(成为行和列索引)进行分组,并计算其频率。

于 2014-07-14T17:32:39.840 回答