首页 > 解决方案 > 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

标签: pythonpandasdataframenumpy

解决方案


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)

推荐阅读