2017-03-03 207 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