【问题标题】:How to count a number of occurrences in Data Frame?如何计算数据框中出现的次数?
【发布时间】:2017-01-04 13:02:24
【问题描述】:

需要帮助。 我有 Pandas DataFrame 之类的:

Shown ID                                       Bought ID
59,60,61,62,60,63,64,65,66,61,67,68,67         67,60,63
63,64,63,64,63,65,66                           0
87,63,84,63,86                                 86

我需要在整个“显示 ID”列中找到每个“显示 ID”行的每个数字的出现次数。

所以“显示 ID”列的预期结果是:

    [[('59', 1), ('60', 2), ('61', 2), ('62', 1), ('63', 6),
      ('64', 3), ('65', 2), ('66', 2), ('67', 2), ('68', 1)],
     [('63', 6), ('64', 3), ('65', 2), ('66', 2)],
     [('87', 1), ('63', 6), ('84', 1), ('86', 1)]]

怎么做?

然后我需要创建一个列表列表,其中包含“显示 ID”列的每一行的排序值(上面列表的每个结果列表列表)。

所以总结结果一定是:

[['63', '64', '60', '61', '65', '66', '67', '68', '59', '62'],
 ['63', '64', '65', '66'],
 ['63', '87', '84', '86']]

我该怎么做? 如果数字出现频率相同,则需要在列表中按升序排序(在行中出现的越早,优先级越高)

【问题讨论】:

  • 我的答案是你要找的吗?

标签: python python-2.7 sorting dataframe find-occurrences


【解决方案1】:

这是您获得所需内容的方式:

import pandas as pd
from collections import Counter


data = [{'c_id' : [59,60,61,62,60,63,64,65,66,61,67,68,67]},
{'c_id' : [63,64,63,64,63,65,66]},
{'c_id' : [87,63,84,63,86]}]

df = pd.DataFrame.from_dict(data)

df['c_id'].apply(lambda val: [key for key,val in Counter(val).most_common()])

输出:

0    [67, 60, 61, 64, 65, 66, 68, 59, 62, 63]
1                            [63, 64, 65, 66]
2                            [63, 84, 86, 87]

具有相同计数的值可能以任意顺序出现。

如果你想制作列级计数器,那么你可以这样做:

all_cids = []
for index, row in df.iterrows():
    all_cids.extend(row['c_id'])

import operator
counter_obj = Counter(all_cids)

def get_ordered_values(values):
    new_values = []
    covered_valeus = set()
    for val in values:
        if val in covered_valeus:
            continue
        covered_valeus.add(val)
        new_values.append((val, counter_obj[val]))    
    new_values.sort(key=operator.itemgetter(1), reverse=True)
    return [key for key, val in new_values]

df['c_id'].apply(lambda values: get_ordered_values(values))

输出

0    [63, 64, 60, 61, 65, 66, 67, 59, 62, 68]
1                            [63, 64, 65, 66]
2                            [63, 84, 86, 87]

【讨论】:

  • 谢谢,但正确的结果是:['63', '64', '60', '61', '65', '66', '67', '68', '59 ', '62'], ['63', '64', '65', '66'], ['63', '87', '84', '86'] 你的版本顺序不同
  • @AlexSavin 你想要它反向排序吗?请先检查您的数据。第一行有 63 个计数为 1。您要在整个列上保留一个全局计数并按此排序吗??
  • 你说得对,在第一行 63 计为 1,但在“显示 ID”列的所有行中,第 63 列出现了 6 次。所以这个数字是列中出现频率最高的。
  • @AlexSavin 因此,您需要跨列进行全局计数。我们能做到这一点。给我一些时间。
  • @AlexSavin 为列级计数器添加了另一个示例。请检查并让我知道这是否是您想要的。谢谢
【解决方案2】:

如果我完全理解,您想查找出现次数,而不是找到特定数据的索引列表。我可以想象几种方法:

  1. 方式:,统计数据。

如果您的数据类型不是多维列表,那么您可以简单地在列表对象中使用计数函数。

# in python3 you would need list(range(3)) etc to test this example
someList = range(3)+range(2)+range(1)

sortedElements = sorted(set(someList)) #> looses duplicates of elements, somelist must be hash-able

for x in sortedElements:
    # list.count(somelist,element) is usable for python2.7 and python3.5
    # tested myself on py interpreter, i can not say for IronPython and/or Rhino enviorment
    print( x, someList.count(x) ) # and there you will have element, and number of occurrences 
  1. 返回重复索引:

    #somelist same as before
    #sortedElements same as before
    for x in sortedElements:
          lIndexes = [ someList.index(elem) for elem in sortedElements if elem == x] 
          print(lIndexes)
    
  2. 多维列表:

在我看来,您必须首先将整个列表转储到 1 个列表中,或者根据您的需要对多维列表的每个子列表执行步骤 1 或 2
当然横向多维列表有几种方式,你可以map或者filter或者reduce或者pass them as *arguments等等(横向多维列表的方式太多了我数不过来,你可以找到大部分本网站上的方法),但您选择的方法与您的示例紧密相关。如果没有进一步的解释,我不敢咨询你,因为它可能会造成更多的伤害和好处。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多