【问题标题】:Pandas: how to add column representing the intersection of 2 attributes in a DataframePandas:如何在 Dataframe 中添加表示 2 个属性交集的列
【发布时间】:2021-01-07 21:32:11
【问题描述】:

假设我有 2 个 csv 文件(非常大的文件),

  • 第一个文件代表餐厅,有6个属性restaurant_id,name,star_rating,city,zone,closed

  • 第二个文件代表餐厅的类别,有两个属性restaurant_idcategory

所以,我想要做的基本上是在我的功能中添加一个名为 zone_categories_intersection 的列,告诉我在同一区域(区域)中与相关餐厅共享至少一个类别的餐厅数量.

因为这是我第一次使用 pandas 库,所以在操作表格时我有点难以流利。我做了这样的事情来计算与相关餐厅相关的区域内的餐厅数量,并将其添加到我的特征列中。


restaurants['nb_restaurants_zone'] = restaurants.groupby('zone')['zone'].transform('size')
restaurants.head()

features = restaurants[['restaurant_id', 'moyenne_etoiles', 'ville', 'zone', 'ferme', 'nb_restaurants_zone']].copy()
features.head()

#edit
merged = restaurants.merge(categories, on='restaurant_id')
merged.head()

我考虑过添加 category.csv 文件并将其与餐厅合并,并将类别映射到相应的 id,然后找出一种方法来应用第二个条件(与餐厅共享至少一个类别)问题)...但我真的不知道如何做这些事情

谢谢

【问题讨论】:

  • @RichieV 我想要做的基本上是在我的功能中添加一个列,告诉我在同一区域(区域)中与相关餐厅共享至少一类食物的餐厅数量.我不知道如何在这里创建一个表格来显示。你,但它很简单。
  • @RichieV 哦,你看到的那些表只是头部,它们要大得多^^
  • 请始终在代码块中显示表格,将无法与文本共享的图像保留为图表等
  • @RichieV 是的 nb_restaurants_zone 已经显示了同一区域中有多少家餐厅,但我想知道同一区域(区域)中与有问题的餐厅。
  • 我明白了,请更改代码块的图像,包括df.head()df2[df2['restaurant_id'].isin(df.head()['restaurant_id'])]

标签: python pandas feature-extraction feature-engineering


【解决方案1】:

试试这个

# sample data
# (it's not exactly your provided data
# but it is better to show how the code works)
# please always provide a callable line of code
# you could get it with `df.head().to_dict('split')`
rest = pd.DataFrame({
    'id': [1, 2, 3, 4, 5],
    'name': ['Denny\'s', 'Ike\'s Love & Sandwiches', 'Midori Japanese',
        'Pho U', 'John & Sons Oysters'],
    'avg_stars': [2.5, 4, 3.5, 3.5, 4],
    'city': ['Las Vegas', 'Phoenix', 'Calgary', 'Toronto', 'Toronto'],
    'zone': ['a', 'a', 'b', 'b', 'a']
})
cats = pd.DataFrame([
    [1, ['Breakfast', 'Dinners', 'American']],
    [2, ['Sandwiches', 'American']],
    [3, ['Japanese']],
    [4, ['Japanese']],
    [5, ['American', 'Seafood']]
], columns=['id', 'category']).explode('category')

代码

# add zone to categories dataframe
cats2 = cats.merge(rest[['id', 'zone']], on='id')

# add count for zone & category
cats2['zone_cat_count'] = (
    cats2.groupby(['zone', 'category'])
    .transform('count')
)

# merge with rest dataframe
rest = rest.merge(
    cats2.groupby('id')['zone_cat_count'].max()
    , on='id'
)

输出

   id                     name  avg_stars       city zone  zone_cat_count
0   1                  Denny's        2.5  Las Vegas    a               3
1   2  Ike's Love & Sandwiches        4.0    Phoenix    a               3
2   3          Midori Japanese        3.5    Calgary    b               2
3   4                    Pho U        3.5    Toronto    b               2
4   5      John & Sons Oysters        4.0    Toronto    a               3

【讨论】:

  • 谢谢你我用我的桌子尝试了这些步骤,它似乎工作。如果我将类别添加到其余数据框(没有像您那样将区域添加到类别中)并使用 .groupby('id')['zone_cat_count'].max(), on= 进行计数,是否也可以'ID' ?另外,您为什么使用 .max?
  • 为了在此处正确显示表格,所以我只在我想要共享的内容上使用df.head().to_dict('split') 并将文本直接复制到此处的代码块上?
  • 这将给出数据框中的前五行,请参阅how to provide a relevant sample... 前 5 行可能不会显示您的数据的复杂性,在这种情况下,包括更多带有 @987654326 的行@ 或创建一个新的玩具数据框
  • 例如,类别数据框的前 5 行对于此示例来说不够用,您需要所有相关的 restaurant_id
  • 如果我将类别添加到其余数据框(没有像您那样将区域添加到类别中)并使用 .groupby('id')['zone_cat_count' ].max(), on='id' ?还有,你为什么使用 .max?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 2020-03-26
  • 2018-07-15
相关资源
最近更新 更多