【问题标题】:Extract data from truth table pandas从真值表 pandas 中提取数据
【发布时间】:2020-05-06 19:46:34
【问题描述】:

我得到了一个真值表,并希望使用它创建一个列表表。我看到很多关于如何创建真值表的提示,但没有太多关于如何返回的提示。当然,我可以通过几个循环来做到这一点,但我认为可能有一种巧妙的 pandas 方式来做到这一点,这会更令人满意。考虑下面的数据框,详细说明一个人拥有的车辆:

+-------+------------+-----+----------+
| Name  | motorcycle | car | unicycle |
+-------+------------+-----+----------+
| Sarah |          1 |   0 |        1 |
| Mike  |          0 |   1 |          |
| Doug  |          1 |   1 |        0 |
+-------+------------+-----+----------+

我想把它改造成这样:

+-------+------------------------+
| Name  |        vehicle         |
+-------+------------------------+
| Sarah | [motorcycle, unicycle] |
| Mike  | [car]                  |
| Doug  | [motorcycle, car]      |
+-------+------------------------+

有没有一种巧妙的 pandas 方法来完成这个?

【问题讨论】:

  • 你能提供一些代码来构建你的数据框吗?

标签: python pandas truthtable


【解决方案1】:

看起来您尝试反转 pd.get_dummies、熔化或数据透视表可能会失败

这是融化的方法

df.melt(id_vars='Name', var_name='vehicle').query('value == 1').groupby('Name').agg({'vehicle': list})

                      vehicle
Name                         
Doug        [motorcycle, car]
Mike                    [car]
Sarah  [motorcycle, unicycle]

【讨论】:

    【解决方案2】:

    IIUC,我们可以将meltlocgroupbyagg(list) 一起使用,注意这仅适用于pandas 0.24+

    s = df.melt(id_vars='Name',var_name='vehicle')
    new_df = s.loc[s['value'] == 1].groupby('Name')['vehicle'].agg(list).to_frame()
    

    print(new_df)
    
                       vehicle
    Name                      
     Doug    [motorcycle, car]
     Mike                [car]
     Sarah        [motorcycle]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 2020-03-23
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      相关资源
      最近更新 更多