【问题标题】:Python/Pandas: Pivot tablePython/Pandas:数据透视表
【发布时间】:2023-03-23 09:53:01
【问题描述】:

在一个 jupyter 笔记本中,我有一个从不同的合并数据集创建的数据框。

record_id | song_id | user_id   | number_times_listened

0          |ABC     | Shjkn4987 |          3
1          |ABC     | Dsfds2347 |          15
2          |ABC     | Fkjhh9849 |          7
3          |XYZ     | Shjkn4987 |          20
4          |XXX     | Shjkn4987 |          5
5          |XXX     | Swjdh0980 |          1

我想通过 song_id 创建一个数据透视表数据框,列出 user_id 的数量和 number_times_listened 的总和。

我知道我需要使用 count 和 sum 函数创建一个 for 循环,但我无法让它工作。我还尝试了 pandas 模块的 pd.pivot_table。

df = pd.pivot_table(data, index='song_ID', columns='userID', values='number_times_listened', aggfunc='sum')

或类似的东西?

total_user=[]
total_times_listened =[]
for x in data: 
    total_user.append(sum('user_id'))
    total_times_listened.append(count('number_times_listened'))
return df('song_id','total_user','total_times_listened')

【问题讨论】:

    标签: python pandas pivot-table


    【解决方案1】:

    您可以将列名字典作为键传递,将函数列表作为值传递:

    funcs = {'number_times_listened':['sum'], 'user_id':['count']}
    

    然后只需在song_id 列上使用df.groupby

    df.groupby('song_id').agg(funcs)
    

    输出:

    number_times_listened   user_id
          sum   count
    song_id         
    ABC     25  3
    XXX     6   2
    XYZ     20  1
    

    【讨论】:

    • 对于我的机器学习模型,我需要有一个标题行 - 在这种情况下,我有 3 个标题行。我一直试图在 python 中修复它,但没有成功。尝试删除 2 个标题行并有一个 behavior_df.columns=['song_id','play_count_sum','user_id_count']
    【解决方案2】:

    不确定这是否相关,但您示例中的列名和大小写与您的 Python 代码不匹配。

    无论如何,以下在 Python 2.7 上适用于我:

    CSV 文件:

    record_id   song_id user_id number_times_listened
    0   ABC Shjkn4987   3
    1   ABC Dsfds2347   15
    2   ABC Fkjhh9849   7
    3   XYZ Shjkn4987   20
    4   XXX Shjkn4987   5
    5   XXX Swjdh0980   1
    

    Python 代码:

    csv_data = pd.read_csv('songs.csv')
    
    df = pd.pivot_table(csv_data, index='song_id', columns='user_id', values='number_times_listened', aggfunc='sum').fillna(0)
    

    生成的数据透视表如下所示:

    user_id  Dsfds2347  Fkjhh9849  Shjkn4987  Swjdh0980
    song_id
    ABC             15          7          3          0
    XXX              0          0          5          1
    XYZ              0          0         20          0
    

    这就是你要找的吗?请记住,song_iduser_id 对在您的数据集中是唯一的,因此在这个特定示例中,聚合函数实际上并没有做任何事情,因为这两列没有任何分组依据。

    【讨论】:

    • 这很棒,虽然我不是在寻找这个,但它实际上给了我一些新的机会 - 谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 2021-01-17
    相关资源
    最近更新 更多