2014-06-24 4 views
0

나는 pandas 라이브러리와 크로스 탭을 사용하여 데이터로 작업 할 주파수 Dataframe을 만들었습니다. 다음 코드에서는 CSV를 읽고 데이터 프레임을 만든 다음 주파수 데이터 프레임 인 크로스 탭을 만듭니다. 그런 다음 데이터의 횡단면을 가져와 열과 데이터를 꺼냅니다.pandas 크로스 탭의 열에 빈 값을 표시하는 방법 Dataframe?

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', '가스'또는 '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 

대신에, 나는 석유, 가스 또는 BIT로 표시 (또는 그 문제에 관해서는 아무것도로 표시) 모든 빈 값에 대한 열을 포함하고 다음을 좀하고 싶습니다. 데이터는 판다의 크로스 탭 dataframe로가는

  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 

은 다음과 같이 구성되어 있습니다 : 여기에서

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 

, 팬더 크로스 탭에 의해 석유, 가스, BIT의 frquency을 캡처 할 주파수 테이블을 만들 것 날짜,하지만 어떻게 빈 값 count.Notice Obj 나열된 일부 열이 있는지 얻으려면 찾을 수 없습니다. 이러한 값은 크로스 탭에서 캡처 할 수 없으며 쿼리 할 수 ​​있기를 원합니다.

제안 사항?

+1

실제 데이터로 재현 가능한 예를 제공하고 예상되는 결과를 보여줄 수 있습니까? – joris

+0

내가 수정을 위해 약간의 수정을했다. – carevans88

+1

문제를 재현하는 예제 * 데이터 *를 제공하는 것이 더 쉽습니다 (동일한 구조의 일부 무작위 데이터는 정상입니다). 아직 나에게는 분명하지 않습니다. – joris

답변

2

하나의 가능성은 원하는 문자열로 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 

은 크로스 탭이 실제로 단지 행과 열 값을 기준으로 그룹화되어 무엇을 (행 및 열 인덱스가되도록) 제공하고이 빈도를 계산합니다.