首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python -在另一列中找到给定匹配字符串的列的平均值。

Python -在另一列中找到给定匹配字符串的列的平均值。
EN

Stack Overflow用户
提问于 2018-02-18 11:40:19
回答 2查看 95关注 0票数 1

我正在试图计算数据文件中包含来自wordlist的单词的产品数量,然后找出这些产品的平均价格。以下的尝试-

代码语言:javascript
复制
for word in wordlist:
    total_count += dframe.Product.str.contains(word, case=False).sum()
    total_price += dframe[dframe['Product'].str.contains(word)]['Price']
    print(dframe[dframe['Product'].str.contains(word)]['Price'])
average_price = total_price / total_count

average_price作为Series([], Name: Price, dtype: float64)返回,而不是按预期返回浮点值。

我做错了什么?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-18 11:42:41

在标量值的每个条件下,需要列sumPrice

代码语言:javascript
复制
total_count, total_price = 0, 0
for word in wordlist:
    total_count += dframe.Product.str.contains(word, case=False).sum()
    total_price += dframe.loc[dframe['Product'].str.contains(word), 'Price'].sum()
average_price = total_price / total_count

或者chache mask用于变量以获得更好的可达性和性能:

代码语言:javascript
复制
total_count, total_price = 0, 0
for word in wordlist:
    mask = dframe.Product.str.contains(word, case=False)
    total_count += mask.sum()
    total_price += dframe.loc[mask, 'Price'].sum()

average_price = total_price / total_count

解决方案应该用regex word1|word2|word3 - | means or简化

代码语言:javascript
复制
mask = dframe.Product.str.contains('|'.join(wordlist), case=False)
total_count = mask.sum()
total_price = dframe.loc[mask, 'Price'].sum()

average_price = total_price / total_count
代码语言:javascript
复制
mask = dframe.Product.str.contains('|'.join(wordlist), case=False)
average_price = dframe.loc[mask, 'Price'].mean()

样本

代码语言:javascript
复制
dframe = pd.DataFrame({
    'Product': ['a1','a2','a3','c1','c1','b','b2','c3','d2'],
    'Price': [1,3,5,6,3,2,3,5,2]
})
print (dframe)
   Price Product
0      1      a1
1      3      a2
2      5      a3
3      6      c1
4      3      c1
5      2       b
6      3      b2
7      5      c3
8      2      d2

wordlist = ['b','c']
mask = dframe.Product.str.contains('|'.join(wordlist), case=False)
average_price = dframe.loc[mask, 'Price'].mean()
print (average_price)
3.8
票数 2
EN

Stack Overflow用户

发布于 2018-02-18 11:48:05

您可以使用value函数来避免级数。

total_count += dframe.Product.str.contains(word,case=False).value.sum()

dframedframe['Product'].str.contains(word).value total_price +=

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48851238

复制
相关文章

相似问题

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