嗨,我想创建一个数据帧,在每个列中存储一个唯一变量及其平均值。目前,我有一个包含2列的数据框。一个具有名称列表,而另一个具有单个值。我想将该值与列表中的所有名称相关联,并最终找到所有名称的平均值 这是我的数据:
Df1:
names_col cost_col
[milk, eggs, cookies] 3
[water, milk, yogurt] 5
[cookies, diaper, yogurt] 7
这就是我想要的:
Df2:
names_col avg_cost_col
milk 4
eggs 3
cookies 5
water 5
yogurt 6
diaper 7
我考虑过以某种方式对所有行进行套用,或使用set()从每个列表中删除重复项,但我不确定。任何帮助将不胜感激
答案 0 :(得分:1)
IIUC将您的列表弄平(嵌套)
pd.DataFrame(data=df.cost_col.repeat(df.names_col.str.len()).values,index=np.concatenate(df.names_col.values)).mean(level=0)
Out[221]:
0
milk 4
eggs 3
cookies 5
water 5
yogurt 6
diaper 7
答案 1 :(得分:1)
Set()是最简单的答案:
l = [["milk", "eggs", "cookies"],
["water", "milk", "yogurt"],
["cookies", "diaper", "yogurt"]]
c = set([*l[0], *l[1], *l[2]])
{'cookies', 'eggs', 'diaper', 'yogurt', 'water', 'milk'}
并将其用于您的熊猫列名称。您可以根据需要使用list()将其转换回列表。
答案 2 :(得分:1)
遵循@MaxU建议的矢量化解决方案in this answer
ndf = pd.DataFrame({'a':np.repeat(df.cost_col.values, df.names_col.str.len()),
'b':np.concatenate(df.names_col.values)})
收益
a b
0 3 milk
1 3 eggs
2 3 cookies
3 5 water
4 5 milk
5 5 yogurt
6 7 cookies
7 7 diaper
8 7 yogurt
然后简单地groupy
+ mean
ndf.groupby('b').mean()
a
b
cookies 5
diaper 7
eggs 3
milk 4
water 5
yogurt 6