pandas 如何赋值以避免重复

6yjfywim  于 2023-05-15  发布在  其他
关注(0)|答案(1)|浏览(135)

假设我有一个 Dataframe
| 日期|变数|标签|计数|
| --------------|--------------|--------------|--------------|
| 1/1| A1| xy1|三|
| 1/1| A1| xy2|二|
| 2/1| B2| xy1|四个|
| 2/1| B2| yy2|四个|
| 2/1| C3| xy1|四个|
| 2/1| C3| yy2|四个|
我想根据最高计数为每个日期的每个变量选择标签。现在对于A1很容易,它将是xy 1,因为它具有最高计数(3)。现在对于B2C3来说,这有点棘手,因为两个标签对两个变量都有相同的计数。但我们知道的是一个标签唯一地属于B2或C3。因此,我们可以将任何标签分配给B2,另一个标签将分配给C3。我们不想给B2和C3分配相同的标签。变量和标签不是唯一的组合,但对于给定的日期,组合是唯一的。
最终的 Dataframe 可能看起来像以下任何一种选项1
| 日期|变数|标签|计数|
| --------------|--------------|--------------|--------------|
| 1/1| A1| xy1|三|
| 2/1| B2| yy2|四个|
| 2/1| C3| xy1|四个|

选项二

日期变数标签计数
1/1A1xy1
2/1B2xy1四个
2/1C3yy2四个

我们如何用pandas或python来实现这一点呢?

xzlaal3s

xzlaal3s1#

一个可能的解决方案是考虑关于标签而不是日期变量的问题。事实上,我们的目标是最大化特定日期/变量对的标签计数。如果我们沿着计数(降序)对数组进行排序并获取标签,我们将最终得到一个分配策略。以最大的标签为例,我们将按顺序取对并删除:

  • 所选变量(该变量已与此日期的标记关联)
  • 选择标签(标签已经分配给该日期的变量)。

我们在剩余的数据集中查找剩余的分配。
下面是一个实现

from collections import defaultdict as ddict
import pandas as pd

df = pd.DataFrame(
    {
        "date": ["1/1", "1/1", "2/1", "2/1", "2/1", "2/1"],
        "variable": ["A1", "A1", "B2", "B2", "C3", "C3"],
        "tag": ["xy1", "xy2", "xy1", "yy2", "xy1", "yy2"],
        "count": [3, 2, 4, 4, 4, 4],
    }
)
df.sort_values("count", ascending=False, inplace=True)

assignments = ddict(list)

for tag in set(df["tag"]):
    var_df = df[df["tag"] == tag]

    for (date, variable), grouped_df in var_df.groupby(
        ["date", "variable"], sort=False
    ):
        if (
            (df["date"] == date) & (df["variable"] == variable) & (df["tag"] == tag)
        ).any():
            assignments[tag].append([date, variable, tag, grouped_df["count"].iloc[0]])
            same_variable_date_df = df[
                (df["date"] == date)
                & ((df["tag"] == tag) | (df["variable"] == variable))
            ]
            df.drop(
                list(same_variable_date_df.index),
                inplace=True,
            )

assigned_df = pd.DataFrame(
    sum(assignments.values(), []), columns=["date", "variable", "tag", "count"]
)
print(assigned_df)

它回来了

date variable  tag  count
0  2/1       B2  xy1      4
1  1/1       A1  xy1      3
2  2/1       C3  yy2      4

相关问题