Pandas按索引值映射,没有虚拟列

时间:2014-08-18 21:09:47

标签: python pandas

我有一个包含100行和两列的DataFrame df,RowId和Probability。现在df根据概率按降序排序(例如0.997,0.973,0.960等),df的索引按升序排列(0,1,2等)。

我想将概率列中的值映射到' s'为了成功'对于前10个值,以及' f'为了'失败'对于其余的。为此,我创建一个名为Index的虚拟列,应用转换,然后删除虚拟列。

df['Index'] = range(0, 100)
df['Probability'] = df[['Probability', 'Index']].apply(lambda x:
                                                       's' if x['Index'] < 10
                                                       else 'f', axis=1)
df_result.drop(['Index'], axis=1)

我有没有办法不用创建虚拟列?

2 个答案:

答案 0 :(得分:2)

如果索引已经0...n,那么这将起作用:

df['Probability'] = np.where(df.index < 10, 's', 'f')

如果您不确定索引是否有序,可以这样吗?

 df.loc[df.index[:10], 'Probability'] = 's'
 df.loc[df.index[10:], 'Probability'] = 'f'

答案 1 :(得分:1)

您可以使用iloc它使用实际位置索引而不是索引列:

a = pandas.DataFrame([[1,2],[3,4],[5,6],[7,8]], columns=['a','b'])
a['c'] = 'f'
>>> a
   a  b  c
0  1  2  f
1  3  4  f
2  5  6  f
3  7  8  f

a.iloc[0:2, a.columns.get_loc('c')] = 's'
>>> a
   a  b  c
0  1  2  s
1  3  4  s
2  5  6  f
3  7  8  f

iloc的缺点是您无法将列名称作为字符串提供,您必须将其位置设为int,这就是我使用a.columns.get_loc的原因。