将pandas数据框的列映射到字典

3
我有一个包含高基数(许多唯一值)的分类变量数据框案例。我想将该变量重新编码为一组值(最常见的前几个值),并用一个捕获所有类别("其他")替换所有其他值。举个简单的例子:
以下是应保持不变的两个值:
top_values = ['apple', 'orange']

我根据下列数据框列中的频率建立了它们:

{'fruits': {0: 'apple',
1: 'apple',
2: 'orange',
3: 'orange',
4: 'banana',
5: 'grape'}}

那个数据框列应该按照以下方式重新编码:
{'fruits': {0: 'apple',
1: 'apple',
2: 'orange',
3: 'orange',
4: 'other',
5: 'other'}}

怎么做呢?(数据框中有数百万条记录)
2个回答

7

您至少可以使用以下几种方法:

where + 布尔索引

df['fruits'].where(df['fruits'].isin(top_values), 'other', inplace=True)

loc + 布尔值索引

df.loc[~df['fruits'].isin(top_values), 'fruits'] = 'other'

这个过程完成后,您可能会希望将系列转换为类别类型:
df['fruits'] = df['fruits'].astype('category')

在进行值替换操作之前这样做可能没有帮助,因为您的输入序列具有高基数。


我想到了一个问题,WHERE代码片段缺乏反转 - 它将替换与模式匹配的值,而不是那些不匹配的值。 - Nick
@Nick,没错,它很容易让人产生误解(与例如np.where相比)。使用pd.Series.mask来更改符合条件的值;使用pd.Series.where来更改不符合条件的值。缺乏直觉可能是它从未流行的原因。 - jpp

1
df.newCol = df.apply(lambda row: row.fruits if row.fruits in top_values else 'others' )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接