【问题标题】:Get data as list of tuple from dataframe column从数据框列获取数据作为元组列表
【发布时间】:2019-06-29 08:44:56
【问题描述】:

输入数据框:

    id    value
0    0     10.2
1    1      5.7
2    2      7.4
3    2      2.5
4    1      2.6
5    3      1.6
6    2      2.9
7    0      3.6
8    2      2.7

预期输出:

format :   [(id,count_of_value,[value as a list])] i.e like this 
           [ (0,2,[10.2, 3.6]), (1, 2, [5.7, 2.6]). . ]

到目前为止,我能够获得前两个元素,即 id,它被视为一个元组,我还需要反向排序的数据,

id_list = df.id.tolist()
count = Counter(uid_list)
ID_count_list = sorted(count.items(), key=operator.itemgetter(1),reverse=True)

获取预期输出中解释的值的最有效方法是什么?

【问题讨论】:

    标签: python pandas list dataframe pandas-groupby


    【解决方案1】:

    您可以使用groupby + apply 一步完成所有操作,匹配所需的输出:

    result = df.groupby('id')['value'].apply(lambda x: (x.name, x.size, x.tolist())).tolist()
    print(result)
    

    输出

    [(0, 2, [10.2, 3.6]), (1, 2, [5.7, 2.6]), (2, 4, [7.4, 2.5, 2.9, 2.7]), (3, 1, [1.6])]
    

    鉴于上面的输出,您可以这样排序:

    result = [(0, 2, [10.2, 3.6]), (1, 2, [5.7, 2.6]), (2, 4, [7.4, 2.5, 2.9, 2.7]), (3, 1, [1.6])]
    s = sorted(result, key=operator.itemgetter(1), reverse=True)
    print(s)
    

    输出 (已排序)

    [(2, 4, [7.4, 2.5, 2.9, 2.7]), (0, 2, [10.2, 3.6]), (1, 2, [5.7, 2.6]), (3, 1, [1.6])]
    

    【讨论】:

    • 不错的编辑:)。我们的解决方案之间的唯一区别是您在 apply 中创建元组(可能效率较低,但也可能更具可读性)。
    • 谢谢@jpp!你知道 agg 是否比 apply 快吗?我只是好奇。
    • 我不确定,老实说,我的 instinctagg,因为您没有构建一系列tuples,但我可能错了。
    • @DanielMesejo :谢谢它的工作,但我希望数据按排序顺序
    • @DanielMesejo:请检查我的问题,我希望它根据最大计数进行排序
    【解决方案2】:

    这是一个groupby 问题。如果列表列表就足够了:

    res = df.groupby('id')['value'].agg(['count', lambda x: x.tolist()])\
            .reset_index().values.tolist()
    
    print(res)
    
    # [[0, 2, [10.2, 3.6]], [1, 2, [5.7, 2.6]],
    #  [2, 4, [7.4, 2.5, 2.9, 2.7]], [3, 1, [1.6]]]
    

    对于元组的列表,还有一个额外的步骤:

    res = list(map(tuple, res))
    
    print(res)
    
    # [(0, 2, [10.2, 3.6]), (1, 2, [5.7, 2.6]),
    #  (2, 4, [7.4, 2.5, 2.9, 2.7]), (3, 1, [1.6])]
    

    【讨论】:

    • 你今天会在那里。恭喜恭喜。
    • @cph_sto,谢谢,刚到,我先休息一下:)
    • Member for 1 year - 非常快。哇...现在去伦敦一家不错的酒吧宠爱自己...这是您的日常。
    • 你激起了我的好奇心已经有一段时间了,如果你允许的话,让我直接告诉你吧! - 我记得你达到 100K 大关的那一天。那是 2 月 5 日。从那天起,你为什么要空白句号来回答任何进一步的问题?似乎你给自己定了一个目标,实现了它,然后就永远退出了。它确实说明了你的性格——你给人的印象是一个具有极大的自制力、纪律和毅力的人,不用说。
    猜你喜欢
    • 2019-11-06
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2018-03-26
    • 2014-12-23
    相关资源
    最近更新 更多