【问题标题】:Creating a boolean table comparing whether values within a column are recurring over similar values in another column创建一个布尔表,比较列中的值是否在另一列中的相似值上重复出现
【发布时间】:2023-03-13 15:59:01
【问题描述】:

我想要达到的目标如下

我有 df:

     Name      Type  Total paid
0    Amy     Jeans          62
1    Amy     Shirt          62
2    Amy     Shoes          62
3   Omar       Hat          25
4   Omar     Jeans          25
5  James       Hat          44
6  James  Bracelet          44
7  James     Jeans          44
8   Emma  Necklace          20
9   Emma     Shirt          20

我想生成如下所示的 df2:

    Name  Jeans  Shirt  Shoes    Hat  Bracelet  Necklace  Total paid
0    Amy   True   True   True  False     False     False          62
1   Omar   True  False  False   True     False     False          25
2  James   True  False  False   True      True     False          44
3   Emma  False   True  False  False     False      True          20

我已经在没有帮助的情况下尝试了 pandas 中的堆栈功能,我已经坚持了一段时间,任何帮助将不胜感激:)

提前致谢!

【问题讨论】:

    标签: python dataframe pandas


    【解决方案1】:

    让我们试试pd.crosstab:

    out = pd.crosstab(df['Name'], df['Type'], values=df['Total paid'],
                      aggfunc='max', 
                      margins=True, margins_name='Total_paid'
                     ).iloc[:-1]
    
    out.iloc[:,:-1] = out.iloc[:,:-1].astype(bool)
    

    输出:

    Type   Bracelet   Hat  Jeans  Necklace  Shirt  Shoes  Total_paid
    Name                                                            
    Amy        True  True   True      True   True   True          62
    Emma       True  True   True      True   True   True          20
    James      True  True   True      True   True   True          44
    Omar       True  True   True      True   True   True          25
    

    【讨论】:

      【解决方案2】:

      上一个答案非常接近,但最终结果有一个小问题。 NaN 是真实的,因此最终输出不正确。一行代码将通过将 NaN 替换为评估为 false 的 0 来解决此问题。

      out = pd.crosstab(df['name'], df['type'], values=df['total_paid'],
                        aggfunc='max', 
                        margins=True, margins_name='total_paid'
                       ).iloc[:-1]
      
      out.fillna(0,inplace = True)
      out.iloc[:,:-1] = out.iloc[:,:-1].astype(bool)
      out
      

      输出:

      type    Bracelet    Hat     Jeans   Necklace    Shirt   Shoes   total_paid
      name                            
      Amy     False       False   True    False       True    True    62
      Emma    False       False   False   True        True    False   20
      James   True        True    True    False       False   False   44
      Omar    False       True    True    False       False   False   25
      

      【讨论】:

        猜你喜欢
        • 2020-10-25
        • 2021-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多