Pandas根据索引值映射,无需虚拟列
我有一个数据表叫做 df,里面有100行和两列,分别是 RowId 和 Probability。现在这个数据表是按照 Probability 的值从大到小排序的(比如说 0.997, 0.973, 0.960 等等),而且它的索引是从小到大排列的(0, 1, 2 等等)。
我想把 Probability 列的前10个值标记为 's',表示“成功”,而剩下的值标记为 '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 个回答
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
的缺点是,你不能用字符串来提供列名,而是必须用整数来表示它们的位置,这就是我使用 a.columns.get_loc
的原因。
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'