【问题标题】:Python Pandas Create unique dataframe out of many listsPython Pandas 从许多列表中创建唯一的数据框
【发布时间】:2019-01-10 20:47:46
【问题描述】:

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

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    Set() 将是删除重复项的最简单方法。
    符号 *list_name 扩展/解压您的列表。

    l = [["milk", "eggs", "cookies"], 
        ["water", "milk", "yogurt"], 
        ["cookies", "diaper", "yogurt"]]
    c = set([*l[0], *l[1], *l[2]])
    {'cookies', 'eggs', 'diaper', 'yogurt', 'water', 'milk'}
    

    并将其用于您的 pandas 列名称。如果需要,您可以使用 list() 将其转换回列表

    【讨论】:

    • 这不是 OP 想要使用 pandas 的问题的答案,也不能回答整个问题
    【解决方案2】:

    遵循@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
    

    【讨论】:

      【解决方案3】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-04
        • 1970-01-01
        • 2021-01-22
        • 2017-04-30
        • 2021-12-06
        • 1970-01-01
        • 2021-04-28
        • 1970-01-01
        相关资源
        最近更新 更多