下面是我使用Pandas创建的DataFrame。
╔════════════════════════╦══════════╗
║ 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来做到这一点呢?
╔══════════╦══════════╗
║ 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的呈现方式,但我意识到它缺少相关数据。如果你的解决方案看起来像这样,而我也在努力实现同样的结果,你的解决方案会发生什么变化?
╔═════════════════════════════════╦══════════╗
║ 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 ║
╚═════════════════════════════════╩══════════╝发布于 2020-01-22 05:29:37
我们可以定义你想要分类的单词,然后使用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.036667https://stackoverflow.com/questions/59849301
复制相似问题