На выходе группы Pandas не отображаются нулевые значения - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь отобразить вхождения значений на основе двух столбцов.Это отлично работает, спасибо Маркусу в этом посте .Тем не менее, я также хотел бы, чтобы он отображал 0 для инцидентов, которые не учитываются (где поле рейтинга равно нулю).В настоящее время он игнорирует нулевые значения.

Текущий вывод:
enter image description here

Как вы можете видеть, для Critical вхождений нет, поэтому они не являютсяпоказ.Мне нужно, чтобы он отображал 0, если для данных сред / рейтингов в кадре данных нет вхождений.

Вывод, который мне нужен:
enter image description here

По сути, я бы хотел, чтобы рейтинги (такие как Критические и другие, P3) всегда отображались, поэтому, даже если нет записей для Критических или Других, он будет отображаться как 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 голосов
/ 11 февраля 2019

Вам нужно reindex по MultiIndex по всей комбинации уникальных значений первого уровня MultiIndex по MultiIndex.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
0 голосов
/ 11 февраля 2019

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...