如何将具有类似字符串值的行聚合为数据帧中的新行?

2024-10-01 04:55:12 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是我用熊猫创建的数据框

╔════════════════════════╦══════════╗
║        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     ║
╚════════════════════════╩══════════╝

我想将字符串与“列A”中的新行类似的行(“Home”将是“/”),其中任何带有“new”的行都将变成“new”,任何带有“used”的行都将变成“used”,任何带有“service”的行都将变成“service”,其他所有行都将被推到“Other”),并在“列B”中找到这些值的平均值如下图所示。我将如何使用Python和Pandas做到这一点

╔══════════╦══════════╗
║ Column A ║ Column B ║
╠══════════╬══════════╣
║ Home     ║ 5.34     ║
║ New      ║ 7.03     ║
║ Used     ║ 2.77     ║
║ Service  ║ 0.29     ║
║ Other    ║ 7.04     ║
╚══════════╩══════════╝

此外,是否也可以将“客户服务”和“联系我们”等特定页面合并到新行“服务”中,而不将“联系我们”计入“其他”中

谢谢大家!

编辑:

@Erfan-您的解决方案在初始数据帧的显示方式上非常有效,但我意识到它缺少相关数据。如果您的解决方案看起来像这样,而我正试图达到相同的结果,您的解决方案会发生什么变化

╔═════════════════════════════════╦══════════╗
║            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     ║
╚═════════════════════════════════╩══════════╝

Tags: 数据newservicecolumncustomer解决方案usedpants
1条回答
网友
1楼 · 发布于 2024-10-01 04:55:12

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

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

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()
  Column A  Column B
0     Home  5.340000
1      New  7.033333
2     Used  2.773333
3  Service  0.290000
4    Other  7.036667

相关问题 更多 >