我有熊猫数据框,例如
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公斤。
答案 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