Python Pandas从许多列表中创建唯一的数据框

时间:2018-08-03 02:24:02

标签: python pandas dataframe

嗨,我想创建一个数据帧,在每个列中存储一个唯一变量及其平均值。目前,我有一个包含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()从每个列表中删除重复项,但我不确定。任何帮助将不胜感激

3 个答案:

答案 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