2017-03-03 205 views
1
>> df 

    Foo  Bar  Number Date 
0 abc  None NaN  NaT 
1 abcdefg None NaN  NaT 
2 abcd this 1111222 3/8/2017 
3 abcd that 1233336 3/3/2017 
4 abcd what 1346554 3/3/2017 
5 abcde that 8889995 3/9/2017 
6 abcde this 1849552 3/8/2017 
7 abcd that 7418652 3/3/2017 
8 abcdef this 4865154 3/7/2017 


>> df.groupby(['Foo']).size().reset_index(name='Total') 

如果我這樣做,該行被視爲有一個值,它的確如此,我明白這一點。我不知道如何在Total中包含該行,但實際上並不計算無/ NaN/NaT值?如何從python groupby中排除NaN/NaT/None,但包含該行?

返回:

Foo  Total 
0 abc  1 
1 abcd 4 
2 abcde 2 
3 abcdef 1 
4 abcdefg 1 

預期結果:

Foo  Total 
0 abc  0 
1 abcd 4 
2 abcde 2 
3 abcdef 1 
4 abcdefg 0 

回答

1

你可以先刪除空值,然後用Foo柱在與填充值結束的唯一值重新索引。

(df.dropna().groupby('Foo') 
      .size() 
      .reindex(df.Foo.unique(), fill_value=0) 
      .reset_index(name='total')) 

或者,你可以讓你的FooCategorical

df.Foo = pd.Categorical(df.Foo) 
df.dropna().groupby('Foo').size().reset_index(name='total') 

演示

>>> (df.dropna().groupby('Foo') 
       .size() 
       .reindex(df.Foo.unique(), fill_value=0) 
       .reset_index(name='total')) 

     Foo total 
0  abc  0 
1 abcdefg  0 
2  abcd  4 
3 abcde  2 
4 abcdef  1 

############################################################################ 

>>> df.Foo = pd.Categorical(df.Foo) 

>>> df.dropna().groupby('Foo').size().reset_index(name='total') 

     Foo total 
0  abc  0 
1  abcd  4 
2 abcde  2 
3 abcdef  1 
4 abcdefg  0 
+0

就是這樣,謝謝!我還沒有使用分類,但現在會檢查出來。 – Mike

+0

@Mike不客氣! – miradulo