Python - 查找包含数据框中单词的前5行

时间:2018-02-23 07:41:16

标签: python python-3.x pandas dataframe

我试图创建一个功能,打印前5个产品及其价格,以及包含词汇表中单词的产品列表的最低5个产品及其价格。我试过这样做 -

def wordlist_top_costs(filename, wordlist):
    xlsfile = pd.ExcelFile(filename)
    dframe = xlsfile.parse('Sheet1')    
    dframe['Product'].fillna('', inplace=True)
    dframe['Price'].fillna(0, inplace=True)
    price = {}
    for word in wordlist:
        mask = dframe.Product.str.contains(word, case=False, na=False)
        price[mask] = dframe.loc[mask, 'Price']

    top = sorted(Score.items(), key=operator.itemgetter(1), reverse=True)
    print("Top 10 product prices for: ", wordlist.name)
    for i in range(0, 5):
        print(top[i][0], "  |  ", t[i][1])  

    bottom = sorted(Score.items(), key=operator.itemgetter(1), reverse=False)
    print("Bottom 10 product prices for: ", wordlist.name)
    for i in range(0, 5):
        print(top[i][0], "  |  ", t[i][1])

但是,上述函数会在行中引发错误 price[mask] = dframe.loc[mask, 'Price in AUD']说 - TypeError: 'Series' objects are mutable, thus they cannot be hashed 任何帮助纠正/修改此赞赏。谢谢!

编辑 - 例如。 wordlist - alu,co,vin

产品|价

  • 铝冠 - 22.20

  • 可口可乐 - 1.0

  • 黄铜盒子 - 28.75

  • Vincent Kettle - 12.00

  • 乙烯基贴纸 - 0.50

  • Doritos - 2.0

  • 科林的发油 - 5.0

  • Vincent Chase太阳镜 - 75.40

  • American Tourister - $ 120.90

输出:

前3个产品价格:

Vincent Chase太阳镜 - 75.40

铝冠 - 22.20

Vincent Kettle - 12.0

底部3产品价格:

乙烯基贴纸 - 0.50

可口可乐 - 1.0

科林的发油 - 5.0

1 个答案:

答案 0 :(得分:2)

您可以使用nlargestnsmallest

#remove $ and convert column Price to floats
dframe['Price'] = dframe['Price'].str.replace('$', '').astype(float)

#filter by regex - joined all values of list by |
wordlist = ['alu', 'co', 'vin'] 
pat = '|'.join(wordlist)
mask = dframe.Product.str.contains(pat, case=False, na=False)
dframe = dframe.loc[mask, ['Product','Price']]

top = dframe.nlargest(3, 'Price')
#top = dframe.sort_values('Price', ascending=False).head(3)
print (top)
                    Product  Price
7  Vincent Chase Sunglasses   75.4
0           Aluminium Crown   22.2
3            Vincent Kettle   12.0

bottom = dframe.nsmallest(3, 'Price')
#bottom = dframe.sort_values('Price').head(3)
print (bottom)
            Product  Price
4    Vinyl Stickers    0.5
1         Coca Cola    1.0
6  Colin's Hair Oil    5.0

<强>设置

dframe = pd.DataFrame({'Price': ['22.20', '1.0', '28.75', '12.00', '0.50', '2.0', '5.0', '75.40', '$120.90'], 'Product': ['Aluminium Crown', 'Coca Cola', 'Brass Box', 'Vincent Kettle', 'Vinyl Stickers', 'Doritos', "Colin's Hair Oil", 'Vincent Chase Sunglasses', 'American Tourister']}, columns=['Product','Price'])
print (dframe)
                    Product    Price
0           Aluminium Crown    22.20
1                 Coca Cola      1.0
2                 Brass Box    28.75
3            Vincent Kettle    12.00
4            Vinyl Stickers     0.50
5                   Doritos      2.0
6          Colin's Hair Oil      5.0
7  Vincent Chase Sunglasses    75.40
8        American Tourister  $120.90