gpt4 book ai didi

python-3.x - 在忽略 NaN 的同时替换 pandas.dataframe 中的低频分类值

转载 作者:行者123 更新时间:2023-12-04 17:07:38 27 4
gpt4 key购买 nike

如何替换很少出现的 pandas.DataFrame 中某些列的值,即频率较低(同时忽略 NaN)?

例如,在以下数据框中,假设我想替换 A 列或 B 列中在其各自列中出现次数少于 3 次的任何值。我想用“其他”替换这些:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A':['ant','ant','cherry', pd.np.nan, 'ant'], 'B':['cat','peach', 'cat', 'cat', 'peach'], 'C':['dog','dog',pd.np.nan, 'emu', 'emu']})
df
A | B | C |
----------------------
ant | cat | dog |
ant | peach | dog |
cherry | cat | NaN |
NaN | cat | emu |
ant | peach | emu |

换句话说,在 A 列和 B 列中,我想替换那些出现两次或更少的值(但不要管 NaN)。

所以我想要的输出是:
   A   |   B   |  C  |
----------------------
ant | cat | dog |
ant | other | dog |
other | cat | NaN |
NaN | cat | emu |
ant | other | emu |

这与之前发布的问题有关: Remove low frequency values from pandas.dataframe

但那里的解决方案导致了“AttributeError: 'NoneType' object has no attribute 'any.'”(我想是因为我有 NaN 值?)

最佳答案

这与 Change values in pandas dataframe according to value_counts() 非常相似.您可以向 lambda 函数添​​加条件以排除列“C”,如下所示:

df.apply(lambda x: x.mask(x.map(x.value_counts())<3, 'other') if x.name!='C' else x)
Out:
A B C
0 ant cat dog
1 ant other dog
2 other cat NaN
3 NaN cat emu
4 ant other emu

这基本上遍历列。对于每一列,它生成值计数并使用该系列进行映射。这允许 x.mask检查计数是否小于 3 的条件。如果是这种情况,它返回“其他”,如果不是,则使用实际值。最后,条件检查列名。

lambda 的条件可以通过将其更改为 x.name not in 'CDEF' 来推广到多列或 x.name not in ['C', 'D', 'E', 'F']来自 x.name!='C' .

关于python-3.x - 在忽略 NaN 的同时替换 pandas.dataframe 中的低频分类值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41577468/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com