首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将df值与列表中的元素进行比较,并使用这些值生成df?

如何将df值与列表中的元素进行比较,并使用这些值生成df?
EN

Stack Overflow用户
提问于 2020-07-03 06:54:30
回答 1查看 48关注 0票数 1

我有一个这样的数据帧:

代码语言:javascript
复制
     Name           Object
     
     Patrick        ball
     Patrick        tshirt
     Patrick        headphones          
     Leonard        ball
     Leonard        tshirt
     Leonard        pants
     Leonard        headphones
     Larry          ball
     Larry          headphones
     Larry          tshirt
     Larry          cellphone
     Maria          book
     Maria          cellphone
     Nick           computer
     Nick           ball

objects=['ball','tshirt','headphones','pants','cellphone','book','computer']

我想要一个数据帧,其中包含人名和缺少的元素,与对象列表进行比较,如下所示:

代码语言:javascript
复制
    Name            Object
    
    Patrick         pants 
    Patrick         cellphone
    Patrick         book
    Patrick         computer
    Leonard         headphones
    Leonard         cellphone
    Leonard         book 
    Leonard         computer
       .               .
       .               .
       .               .
    Nick            tshit
    Nick            headphones
    Nick            pants
    Nick            cellphone
    Nick            book
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-03 07:26:44

您可以将pivot_tableany一起用作聚合函数,并将列与objects列表一起使用reindex。使用stack返回序列,但不删除nan (丢失的对象),然后使用isna选择行并创建所需的数据帧。

代码语言:javascript
复制
s = (df.pivot_table(index='Name', columns='Object', aggfunc=any)
       .reindex(columns=objects)
       .stack(dropna=False)
    )
df_ = s[s.isna()].index.to_frame().reset_index(drop=True)
print(df_)
       Name      Object
0   Patrick       pants
1   Patrick   cellphone
2   Patrick        book
3   Patrick    computer
4   Leonard   cellphone
5   Leonard        book
6   Leonard    computer
7     Larry       pants
8     Larry        book
9     Larry    computer
10    Maria        ball
11    Maria      tshirt
12    Maria  headphones
13    Maria       pants
14    Maria    computer
15     Nick      tshirt
16     Nick  headphones
17     Nick       pants
18     Nick   cellphone
19     Nick        book

要创建s,还可以将set_indexreindex与基于列名的unique元素的MultiIndex.from_product和列表objects一起使用。如果数据帧中有其他列,这种方法会很有趣,这里需要用assign创建一个随机列来执行此操作。

代码语言:javascript
复制
s = (df.assign(a=True)
       .set_index(['Name', 'Object'])['a']
       .reindex(pd.MultiIndex.from_product([df.Name.unique(), objects], 
                                           names=['Name', 'Object']))
    )
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62706138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档