【问题标题】:Creating a new column for each potential value in a column to create a truth array matching the row value为列中的每个潜在值创建一个新列以创建与行值匹配的真值数组
【发布时间】:2020-03-03 02:08:26
【问题描述】:

我有一个通用格式的数据集:

group_id   item_id  zone   time 
       1         1     1      1
       1         3     4      1
       2         6     3      1
       2         2     4      1
       3         1     1      1
       1         2     3      2
       1         6     2      2
       2         8     1      2
       2         5     2      2
       3         1     1      2

我希望为区域列中的每个潜在值创建一个新列,然后如果它代表该行,则为其分配一个真值。假设有四个潜在区域,列在names = ['zone_1', 'zone_2', 'zone_3', 'zone_4'] 中。输出应该是这样的:

group_id   item_id  time  zone_1  zone_2  zone_3  zone_4
       1         1     1       1       0       0       0
       1         3     1       0       0       0       1
       2         6     1       0       0       1       0
       2         2     1       0       0       0       1
       3         1     1       1       0       0       0      
       1         2     2       0       0       1       0
       1         6     2       0       1       0       0
       2         8     2       1       0       0       0
       2         5     2       0       1       0       0
       3         1     2       1       0       0       0

我不确定如何最好地实现这一目标。我可以直接从名称列表中创建新列。我可以为区域创建一个适当的数组(例如,将区域值 3 替换为 [0,0,1,0]),然后在“区域”上的 pd.explode 后跟一个枢轴,但逐行替换是密集的而且不是很像熊猫。我感谢任何其他建议。

需要注意的是 group_id + item_id + time 创建了一个唯一的项目(没有两个项目在所有三个值上都相同)。

谢谢!

编辑: 澄清一下,正如我不清楚的那样:可能存在比列中唯一出现的更多潜在区域。例如,上述数据集可以与names = ['zone_1', 'zone_2', 'zone_3', 'zone_4', 'zone_5] 配对。即使数据框中没有区域 5 出现的实例,它也需要一个新列。理想情况下,解决方案还将为此创建一个列(用于以后的可视化目的)。这种情况下的输出是:

group_id   item_id  time  zone_1  zone_2  zone_3  zone_4  zone_5
       1         1     1       1       0       0       0       0
       1         3     1       0       0       0       1       0
       2         6     1       0       0       1       0       0
       2         2     1       0       0       0       1       0
       3         1     1       1       0       0       0       0
       1         2     2       0       0       1       0       0
       1         6     2       0       1       0       0       0
       2         8     2       1       0       0       0       0
       2         5     2       0       1       0       0       0
       3         1     2       1       0       0       0       0

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    让我们做crosstab

    df=df.join(pd.crosstab(df.index,df.zone).add_prefix('zone_'))
    df
       group_id  item_id  zone  time  zone_1  zone_2  zone_3  zone_4
    0         1        1     1     1       1       0       0       0
    1         1        3     4     1       0       0       0       1
    2         2        6     3     1       0       0       1       0
    3         2        2     4     1       0       0       0       1
    4         3        1     1     1       1       0       0       0
    5         1        2     3     2       0       0       1       0
    6         1        6     2     2       0       1       0       0
    7         2        8     1     2       1       0       0       0
    8         2        5     2     2       0       1       0       0
    9         3        1     1     2       1       0       0       0
    

    【讨论】:

    • 您好,感谢您的回答!起初我认为这是一个完美的答案,尽管在考试中我有几个问题!我应该澄清的是,并非所有潜在区域都会在“区域”列中具有值。因此,在另一个示例中,如果有 6 个潜在区域(在列表 zones 中),而区域列中可能有 4 个唯一值,则需要创建 6 个列 - 否则区域编号及其真值列名称不匹配。清楚吗?
    • @ebrithilotho 你可以做 reindex ,在 pd.crosstab 之后
    【解决方案2】:

    IIUC,使用pandas.get_dummies

    zones = df.pop("zone")
    new_df = pd.concat([df, pd.get_dummies(zones, prefix="zone")], 1)
    print(new_df)
    

    输出:

       group_id  item_id  time  zone_1  zone_2  zone_3  zone_4
    0         1        1     1       1       0       0       0
    1         1        3     1       0       0       0       1
    2         2        6     1       0       0       1       0
    3         2        2     1       0       0       0       1
    4         3        1     1       1       0       0       0
    5         1        2     2       0       0       1       0
    6         1        6     2       0       1       0       0
    7         2        8     2       1       0       0       0
    8         2        5     2       0       1       0       0
    9         3        1     2       1       0       0       0
    

    【讨论】:

    • 感谢您的回答!与上述类似,区域中的唯一实例可能少于区域的总数。假设我有一个区域列表 [1, 2, 3, ...6],其中只有 4 个可能出现在区域列中,但我需要为每个 潜在 区域创建一个新列。我将澄清原始帖子,因为您的回复适用于给出的示例
    猜你喜欢
    • 2020-09-26
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    相关资源
    最近更新 更多