Pandas根据索引值映射,无需虚拟列

0 投票
2 回答
747 浏览
提问于 2025-04-18 17:43

我有一个数据表叫做 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'

撰写回答