通过熊猫加权处理value_counts

时间:2020-11-08 09:15:48

标签: python pandas dataframe

我有熊猫数据框,例如

basket_id = [1,2,3,4,5]
continents = ['apple', 'apple orange', 'apple orange pear', 'pear apple', 'pear']
df = pd.DataFrame({'basket_id' : basket_id , 'continents ' : continents })

购物篮相等,例如18公斤,每个购物篮中的每种水果的摄入量相等:第二购物篮中有9公斤苹果和9公斤橙子。

我想知道每种水果有多少。如果每个篮子只有一种水果,我可以简单地应用value_counts并乘以18。但是现在我如何得到答案?

我希望以下几点:

fruits = ['apple', 'orange', 'pear']
amounts = [42, 15, 33]
df1 = pd.DataFrame({'fruits' : fruits , 'amounts(kg)' : amounts })
df1

苹果重42公斤:从篮子1取出18公斤,篮子2取出9公斤,篮子3取出6公斤,篮子4取出9公斤。

2 个答案:

答案 0 :(得分:1)

您可以使用Series.str.split,然后Series.explode现在使用GroupBy.transform来计算篮子中有多少水果,然后使用Series.rdiv来获得每个篮子中的相对权重,然后对每个篮子进行分组水果,取总和。

out = df['continents'].str.split().explode()
amt = out.groupby(level=0).transform('count').rdiv(18).groupby(out).sum()

apple     42.0
orange    15.0
pear      33.0
Name: continents , dtype: float64

要获得所提及的准确输出,必须先使用Series.reset_index然后使用Series.rename

amt.reset_index(name='amounts(kg)').rename(columns={'index':'fruit'})

    fruit  amounts(kg)
0   apple         42.0
1  orange         15.0
2    pear         33.0

答案 1 :(得分:0)

因此,对于购物篮中每N件物品,您要添加18 / N公斤的物品吗?您可以使用defaultdict(int),它可以通过调用int()(它是0)来为未知条目生成默认值,并将其金额相加。

baskets = ['apple', 'apple orange', 'apple orange pear', 'pear apple', 'pear']

from collections import defaultdict

amounts = defaultdict(int)
for basket in baskets:
    items = basket.split()
    for item in items:
        amounts[item] += 18 // len(items)

print(amounts)
# defaultdict(<class 'int'>, {'apple': 42, 'orange': 15, 'pear': 33})

# if you need a pandas output
import pandas as pd

print(pd.Series(amounts))
# apple     42
# orange    15
# pear      33
# dtype: int64