【问题标题】:Python Dataframe- count occurrences of list elementPython Dataframe-计算列表元素的出现次数
【发布时间】:2020-12-14 17:50:26
【问题描述】:

我有以下数据框:

basket_new 列包含列表中从 0 到 5 的数字(每个数字和交易的金额可能不同)。我想计算每个事务的每个数字的出现次数,并将该数字保存在另一个 DataFrame 中,如下所示:

我刚刚为 Cat_0 创建了一个 lambda 函数来测试它,不幸的是它没有工作,因为它正在创建“无”条目(见图 2)。

这是函数:

df_cat["Cat_0"] = df_train["basket_new"].map(lambda x: df_cat["Cat_0"]+1 if "0" in x else None)

你能告诉我我做错了什么/如何解决我的问题吗?

【问题讨论】:

    标签: python pandas dataframe counter


    【解决方案1】:

    使用explodecrosstab。 假设你有一个这样的 df:

    df = pd.DataFrame({'a':[1,2,3,4], 'b':[[1,2],[0],[3,1,2,3],[4,2,2,2,1]]})
    

    df:

        a   b
    0   1   [1, 2]
    1   2   [0]
    2   3   [3, 1, 2, 3]
    3   4   [4, 2, 2, 2, 1]
    

    df1 = df['b'].explode()
    df[['a', 'b']].join(pd.crosstab(df1.index, df1))
    

        a   b               0   1   2   3   4
    0   1   [1, 2]          0   1   1   0   0
    1   2   [0]             1   0   0   0   0
    2   3   [3, 1, 2, 3]    0   1   1   2   0
    3   4   [4, 2, 2, 2, 1] 0   1   3   0   1
    

    如果要重命名列:

    df[['a', 'b']].join(pd.crosstab(df1.index, df1, colnames=['b']).add_prefix('cat_'))
    

        a   b               cat_0  cat_1  cat_2 cat_3 cat_4
    0   1   [1, 2]          0      1      1     0     0
    1   2   [0]             1      0      0     0     0
    2   3   [3, 1, 2, 3]    0      1      1     2     0
    3   4   [4, 2, 2, 2, 1] 0      1      3     0     1
    

    【讨论】:

    • 这可能是比我的“更好”的答案。更多pandas-thonic。我还认为大型数据集的速度要快得多。
    【解决方案2】:

    使用list.count() 方法:

    df_cat["Cat_0"] = df['basket_new'].map(lambda x: x.count(0))
    

    使用数据的前 5 行:

    for i in range(0,5): df_cat["Cat_{0}".format(i)] = df['basket'].map(lambda x: x.count(i))
    
       Cat_0  Cat_1  Cat_2  Cat_3  Cat_4  Cat_5
    0      0      0      0      1      0      0
    1      1      0      0      2      0      1
    2      0      1      0      1      1      1
    3      0      0      1      0      0      0
    4      0      0      0      0      4      0
    

    【讨论】:

      【解决方案3】:

      这是一个相当长的,但它的工作原理

      df.explode('basket_new').groupby(['transaction_id','customerType','basket_new']).agg(count = ('basket_new','count'))\
      .reset_index().pivot_table(index=['transaction_id','customerType'], columns='basket_new', values='count', fill_value=0)\
      .reset_index()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-04
        • 2020-06-09
        • 2011-08-10
        • 1970-01-01
        • 2018-11-20
        • 2012-08-03
        • 1970-01-01
        相关资源
        最近更新 更多