我有一个包含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)
我有没有办法不用创建虚拟列?
答案 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
的原因。