首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在pandas DataFrame中聚合与新行具有相似字符串值的行?

如何在pandas DataFrame中聚合与新行具有相似字符串值的行?
EN

Stack Overflow用户
提问于 2020-01-22 05:13:14
回答 1查看 130关注 0票数 1

下面是我使用Pandas创建的DataFrame。

代码语言:javascript
复制
╔════════════════════════╦══════════╗
║        Column A        ║ Column B ║
╠════════════════════════╬══════════╣
║ /                      ║ 5.34     ║
║ new-shirts             ║ 6.78     ║
║ new-pants              ║ 10.11    ║
║ used-hats              ║ 1.56     ║
║ used-shirts            ║ 3.78     ║
║ brand-new-watches/gold ║ 4.21     ║
║ customer-service       ║ 0.29     ║
║ holiday-blowout-sale   ║ 12.45    ║
║ used-pants/corduroy    ║ 2.98     ║
║ special-discounts      ║ 6.99     ║
║ contact-us             ║ 1.67     ║
╚════════════════════════╩══════════╝

我想将具有相似字符串的行聚合为"Column A“中的新行("Home”将是"/",任何带有" new“的内容将成为"New",任何带有"used”的内容将变为"Used",任何带有"service“的内容将变为"Service”,其他所有内容将被推送到"Other"),并在"Column B“中找到这些值的平均值,如下所示。我如何使用Python和Pandas来做到这一点呢?

代码语言:javascript
复制
╔══════════╦══════════╗
║ Column A ║ Column B ║
╠══════════╬══════════╣
║ Home     ║ 5.34     ║
║ New      ║ 7.03     ║
║ Used     ║ 2.77     ║
║ Service  ║ 0.29     ║
║ Other    ║ 7.04     ║
╚══════════╩══════════╝

此外,是否还可以将"customer-service“和"contact-us”等页面合并到新的行"Service“中,而"contact-us”不计入"Other"?

谢谢!

编辑:

@Erfan -您的解决方案很好地解决了初始DataFrame的呈现方式,但我意识到它缺少相关数据。如果你的解决方案看起来像这样,而我也在努力实现同样的结果,你的解决方案会发生什么变化?

代码语言:javascript
复制
╔═════════════════════════════════╦══════════╗
║            Column A             ║ Column B ║
╠═════════════════════════════════╬══════════╣
║ /                               ║ 5.34     ║
║ /new-shirts/                    ║ 6.78     ║
║ /new-pants/                     ║ 10.11    ║
║ /used-hats/                     ║ 1.56     ║
║ /used-shirts/                   ║ 3.78     ║
║ /brand-new-watches/gold/        ║ 4.21     ║
║ /customer-service/              ║ 0.29     ║
║ /holiday-blowout-sale/december/ ║ 12.45    ║
║ /used-pants/corduroy/           ║ 2.98     ║
║ /special-discounts/             ║ 6.99     ║
║ /contact-us/                    ║ 1.67     ║
╚═════════════════════════════════╩══════════╝
EN

回答 1

Stack Overflow用户

发布于 2020-01-22 05:29:37

我们可以定义你想要分类的单词,然后使用Series.str.extract从你的字符串中提取这些类别。

然后我们使用GroupBy.sum来获得每个类别的总和:

代码语言:javascript
复制
words = ['/', 'New', 'Used', 'Service']

cats = (
    df['Column A'].str.extract('((?i)'+'|'.join(words)+')')
                  .fillna('other')[0]
                  .str.capitalize()
                  .str.replace('/', 'Home')
)

df = df.groupby(cats, sort=False)['Column B'].mean().rename_axis('Column A', axis=0).reset_index()
代码语言:javascript
复制
  Column A  Column B
0     Home  5.340000
1      New  7.033333
2     Used  2.773333
3  Service  0.290000
4    Other  7.036667
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59849301

复制
相关文章

相似问题

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