如何计算数据框中出现的次数?

How to count a number of occurrences in Data Frame?

需要帮助。 我有 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

我需要找出每个 "Show ID" 行的每个数字在整个 "Show ID" 列中出现的次数。

所以 "Shown 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)]]

怎么做?

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

所以汇总结果必须是:

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

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

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

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]

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

  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
当然横向多维列表有几种方法,你可以mapfilterreducepass them as *arguments等(横向多维列表的方法太多了我无法计数,你可以在这个网站上找到大部分方法)但是你选择的方法与你的例子紧密相关。如果没有进一步的解释,我不敢咨询你,因为它可能会造成更大的伤害和好处。

希望对您有所帮助。