[英]Pandas has two dataframes, want the average of the divisions between each group
[英]Average vectors between two pandas DataFrames
假设有两个DataFrame,分别是
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'item':['apple', 'orange', 'melon',
'meat', 'milk', 'soda', 'wine'],
'vector':[[12, 31, 45], [21, 14, 56],
[9, 47, 3], [20, 7, 98],
[11, 67, 5], [23, 45, 3],
[8, 9, 33]]})
df2 = pd.DataFrame({'customer':[1,2,3],
'grocery':[['apple', 'soda', 'wine'],
['meat', 'orange'],
['coffee', 'meat', 'milk', 'orange']]})
df1 和 df2 的输出是
df1
item vector
0 apple [12, 31, 45]
1 orange [21, 14, 56]
2 melon [9, 47, 3]
3 meat [20, 7, 98]
4 milk [11, 67, 5]
5 soda [23, 45, 3]
6 wine [8, 9, 33]
df2
customer grocery
0 1 [apple, soda, wine]
1 2 [meat, orange]
2 3 [coffee, meat, milk, orange]
目标是平均每个客户的购物清单的向量。 如果 df1 中没有列出某个项目,则使用[0, 0, 0]
表示,因此'coffee' = [0, 0, 0]
。 最终的数据帧 df2 会像
customer grocery average
0 1 [apple, soda, wine] [14.33, 28.33, 27]
1 2 [meat, orange] [20.5, 10.5, 77]
2 3 [coffee, meat, milk, orange] [13, 22, 39.75]
其中 customer1 是平均苹果、苏打水和葡萄酒的向量。 customer3 是平均咖啡、肉、牛奶和橙子的向量,同样,这里的coffee = [0, 0, 0]
因为它不在 df1 上。 有什么建议么? 提前谢谢了
这个答案可能冗长且未优化,但它会满足您的目的。
首先,您需要检查 df2 中的项目是否在 df1 中,以便您可以将不存在的项目与 0 一起添加到 df1 中。
import itertools
for i in set(itertools.chain.from_iterable(df2['grocery'])):
if i not in list(df1['item']):
df1.loc[len(df1.index)] = [i,[0,0,0]]
接下来,您可以执行列表推导以查找列表的平均值并将其添加到 df2 中的新列。
df2['average'] = [np.mean(list(df1.loc[df1['item'].isin(i)]["vector"]),axis=0) for i in df2["grocery"]]
df2
Out[91]:
customer ... average
0 1 ... [14.333333333333334, 28.333333333333332, 27.0]
1 2 ... [20.5, 10.5, 77.0]
2 3 ... [13.0, 22.0, 39.75]
[3 rows x 3 columns]
你能检查这是否有效吗? 如果它有效,我会添加一个解释。
d2 = df2.explode('grocery')
df2['average'] = d2['grocery'].map(df1.set_index('item')['vector'].map(np.mean)).fillna(0).round(1).groupby(level=0).agg(list)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.