0

我想要实现的是以下

我有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 中的堆栈功能,我已经坚持了一段时间,任何帮助将不胜感激:)

提前致谢!

4

2 回答 2

0

先前的答案非常接近,但最终结果存在小问题。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
于 2021-03-30T19:41:24.090 回答
0

让我们试试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
于 2021-03-30T16:46:05.613 回答