python - python/pandas:根据包含同一列总和的系列更新列
问题描述
我有一个具有非唯一 col1 的数据框,如下所示
col1 col2
0 a 1
1 a 1
2 a 2
3 b 3
4 b 3
5 c 2
6 c 2
col1 的某些值会重复很多次,而另一些则不会。我想取底部(80%/50%/10%)并在绘图之前将值更改为“其他”。
我有一个系列,其中包含 col1 中的代码(作为索引)以及它们在 df 中按降序出现的次数,方法是执行以下操作:
df2 = df.groupby(['col1']).size().sort_values(ascending=False)
我也有我的分界点(底部 80%)
cutOff = round(len(df2)/5)
当col1出现在df2系列索引中的cutOff之后,我想用值“others”更新df中的col1。
我不知道如何进行检查和更新。我认为最好的方法是在 col1 上做一个 groupby 然后循环,但它开始分崩离析,我应该创建一个新的 groupby 对象吗?还是我将其称为每行的 .apply() ?您可以更新用作数据框索引的列吗?关于如何开始,我可以提供一些帮助。
编辑添加:
因此,如果 col1 中的“b”不在 col1 中人口最多的前 20% 值中,那么我希望看到:
col1 col2
0 a 1
1 a 1
2 a 2
3 others 3
4 others 3
5 c 2
6 c 2
解决方案
data = [["a ", 1],
["a ", 1],
["a ", 2],
["b ", 3],
["b ", 3],
["c ", 2],
["c ", 2], ]
df = pd.DataFrame(data, columns=["col1", "col2"])
print(df)
df2 = df.groupby(['col1']).size().sort_values(ascending=False)
print(df2)
cutOff = round(len(df2) / 5)
others = df2.iloc[cutOff + 1:]
print(others)
result = df.copy()
result.loc[result["col1"].isin(others.index), "col1"] = "others"
print(result)
推荐阅读
- java - 詹金斯无法检测到场景
- jira - 在 Windows 上将 dc-app-performance-toolkit 与 Taurus 一起使用
- 3d - 将 2 个角度(球面旋转)转换为单个角度(四元数)
- java - 在定位图像时上传到存储时出现问题
- r - 根据 data.table (R) 列中的更改值对组进行编号
- python - 在 Python 中为每 5 行分配 +1 值(增量)
- sql - PostgreSQL 序列:如何在调用时始终递增(无论 select 语句的结果是什么)?
- r - 情感者 - 不同文本分区的不同结果
- reactjs - 带有 Typescript 的类组件中的 React.useContext:无法解析类装饰器的签名
- react-native - 视图不以给定大小呈现