我正在尝试根据两列来映射值的出现。感谢Marcus在post中的工作,它的运行效果很好。但是,我也希望它为没有计数的事件显示0(评分字段为null)。当前它会忽略空值。
如您所见,Critical没有发生,因此没有显示。如果数据框中的那些环境/等级没有出现,我需要将其显示为0。
基本上,我希望始终显示评级(例如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
谢谢!
答案 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)
您需要MultiIndex
到reindex
的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