根据列值将一列分为两部分

时间:2020-01-17 16:03:48

标签: python pandas dataframe

我有一个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可以通过对主管和得分列进行分组并获得得分计数来工作吗?

3 个答案:

答案 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
相关问题