我有一个dataframe
,看起来像这样:
Supervisor Score
Bill Pass
Bill Pass
Susan Fail
Susan Fail
Susan Fail
我想进行一些汇总(例如,通过主管获取通过率的百分比),并希望将“得分”列分开,以便所有“通过”都在一个列中,而所有“失败”都在另一列中。像这样:
Supervisor Pass Fail
Bill 0 1
Bill 0 1
Susan 1 0
Susan 1 0
Susan 1 0
有什么想法吗?一个简单的groupby
可以通过对主管和得分列进行分组并获得得分计数来工作吗?
答案 0 :(得分:5)
pd.get_dummies
使用默认命名约定'OrigName_UniqueVal'
,从DataFrame中删除所有指定的列,以N个虚拟列为准。为前缀和分隔符指定空字符串将使您仅获得唯一值的列标题。
pd.get_dummies(df, columns=['Score'], prefix_sep='', prefix='')
Supervisor Fail Pass
0 Bill 0 1
1 Bill 0 1
2 Susan 1 0
3 Susan 1 0
4 Susan 1 0
如果最后您只希望主管让每个类别的%,那么您实际上就不需要假人了。您可以groupby
。我使用reindex
来确保结果DataFrame具有为每个主管表示的每个类别。
(df.groupby(['Supervisor']).Score.value_counts(normalize=True)
.reindex(pd.MultiIndex.from_product([df.Supervisor.unique(), df.Score.unique()]))
.fillna(0))
#Bill Pass 1.0
# Fail 0.0
#Susan Pass 0.0
# Fail 1.0
#Name: Score, dtype: float64
答案 1 :(得分:3)
IIUC,您需要DataFrame.pivot_table
+ DataFrmae.join
new_df = df[['Supervisor']].join(df.pivot_table(columns = 'Score',
index = df.index,
values ='Supervisor',
aggfunc='count',
fill_value=0))
print(new_df)
Supervisor Fail Pass
0 Bill 0 1
1 Bill 0 1
2 Susan 1 0
3 Susan 1 0
4 Susan 1 0
对于预期的输出:
new_df = df[['Supervisor']].join(df.pivot_table(columns = 'Score',
index = df.index,
values ='Supervisor',
aggfunc='count',
fill_value=0)
.eq(0)
.astype(int))
print(new_df)
Supervisor Fail Pass
0 Bill 1 0
1 Bill 1 0
2 Susan 0 1
3 Susan 0 1
4 Susan 0 1
答案 2 :(得分:1)
**Let's try this one**
df=pd.DataFrame({'Supervisor':['Bill','Bill','Susan','Susan','Susan'],
'Score':['Pass','Pass','Fail','Fail','Fail']}).set_index('Supervisor')
pd.get_dummies(df['Score'])
PANDAS 100 tricks
For More Pandas trick refer following : https://www.kaggle.com/python10pm/pandas-100-tricks