熊猫groupby输出未显示空值

时间:2019-02-11 03:35:18

标签: python python-3.x pandas dataframe

我正在尝试根据两列来映射值的出现。感谢Marcus在post中的工作,它的运行效果很好。但是,我也希望它为没有计数的事件显示0(评分字段为null)。当前它会忽略空值。

当前输出为:
enter image description here

如您所见,Critical没有发生,因此没有显示。如果数据框中的那些环境/等级没有出现,我需要将其显示为0。

我想要的输出是:
enter image description here

基本上,我希望始终显示评级(例如Critical和Others P3),这样,即使没有Critical或Others条目,该环境也将显示为0。

这是当前代码:
csvfile = pd.read_csv("rawstats.csv", encoding = "ISO-8859-1", usecols=['Environment/s Affected', 'Rating'])
df = pd.DataFrame(csvfile)
df.groupby(['Environment/s Affected', (df['Rating'].isin(['1', '2']))]).size().rename(index={True: 'Critical', False: 'Others P3+'}, level=1).to_csv('summary.csv')

样本数据:
Rating,Environment/s Affected 3,Env1 3,Env1 3,Env1 3,Env2 3,Env2 3,Env2 3,Env2 3,Env3 3,Env3 3,Env3 3,Env3 3,Env3 3,Env4 3,Env4 3,Env4 3,Env4 3,Env4 3,Env4 4,Test5 4,Test5 4,Test5 4,Test5 4,Test5 4,Test5 4,Test5 ,Env1 ,Env1 ,Env3 ,Env4 ,Env1

谢谢!

2 个答案:

答案 0 :(得分:0)

groupby不会显示NaN值,您需要先将其替换为虚拟值:

In [11]: df = pd.DataFrame([[1, 2], [3, 4], [pd.np.nan, 6]], columns=["A", "B"])

In [12]: df
Out[12]:
     A  B
0  1.0  2
1  3.0  4
2  NaN  6

In [13]: df.groupby("A").mean()  # no nulls
Out[13]:
     B
A
1.0  2
3.0  4

例如,您可以使用-1:

In [14]: df.replace({"A": {np.nan: -1}}).groupby("A").mean()
Out[14]:
      B
A
-1.0  6
 1.0  2
 3.0  4

In [15]: df.replace({"A": {np.nan: -1}}).groupby("A").mean().reset_index().replace({"A": {-1: np.nan}})
Out[15]:
     A  B
0  NaN  6
1  1.0  2
2  3.0  4

答案 1 :(得分:0)

您需要MultiIndexreindexMultiIndexMultiIndex.from_product的唯一值的所有组合:

s = (df.groupby(['Environment/s Affected', 
                 (df['Rating'].isin(['1', '2']))]).size()
       .rename(index={True: 'Critical', False: 'Others P3+'}, level=1))
print (s)
Environment/s Affected  Rating    
Env1                    Others P3+    6
Env2                    Others P3+    4
Env3                    Others P3+    6
Env4                    Others P3+    7
Test5                   Others P3+    7
dtype: int64

mux = pd.MultiIndex.from_product([df['Environment/s Affected'].unique(),
                                 ['Others P3+', 'Critical']],
                                 names=['Environment/s Affected','Rating'])
print (mux)
MultiIndex(levels=[['Env1', 'Env2', 'Env3', 'Env4', 'Test5'], ['Critical', 'Others P3+']],
           codes=[[0, 0, 1, 1, 2, 2, 3, 3, 4, 4], [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]],
           names=['Environment/s Affected', 'Rating'])

df1 = s.reindex(mux, fill_value=0).reset_index(name='counts')
print (df1)
  Environment/s Affected      Rating  counts
0                   Env1  Others P3+       6
1                   Env1    Critical       0
2                   Env2  Others P3+       4
3                   Env2    Critical       0
4                   Env3  Others P3+       6
5                   Env3    Critical       0
6                   Env4  Others P3+       7
7                   Env4    Critical       0
8                  Test5  Others P3+       7
9                  Test5    Critical       0

如果最后一行需要Critical,请添加sort_index

df1 = (s.reindex(mux, fill_value=0)
        .sort_index(level=[1,0], ascending=[False, True])
        .reset_index(name='counts'))
print (df1)
  Environment/s Affected      Rating  counts
0                   Env1  Others P3+       6
1                   Env2  Others P3+       4
2                   Env3  Others P3+       6
3                   Env4  Others P3+       7
4                  Test5  Others P3+       7
5                   Env1    Critical       0
6                   Env2    Critical       0
7                   Env3    Critical       0
8                   Env4    Critical       0
9                  Test5    Critical       0