0

私はパンダライブラリとクロスタブを使用して、データを操作する頻度データフレームを作成しています。次のコードでは、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 のピボット テーブルでは、ピボット テーブルに含める列を選択するときに (空白の) ボックスをオンにすることでこれを行うことができます。ここで同じことを行い、空白のすべての頻度カウントを取得します。

助言がありますか?

現在、次の出力が得られます。これには、指定された 3 つの列と以下の頻度のみが含まれます。

            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

1 つの可能性は、NaN 値を目的の文字列 (例: 'blank') で埋めて、それらもカウントされるようにすることです。

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 に答える