如何计算数据框中出现的次数?
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]
如果我完全理解它,您想要查找出现次数而不是找到特定数据的索引列表。我可以想象有几种方法可以做到这一点:
- 方式:,统计数据
如果你的数据类型不是多维列表,那么你可以简单地在列表对象中使用计数函数。
# 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
返回重复索引:
#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)
多维列表:
如我所见,您必须首先将整个列表转储到 1 个列表中,或者,根据需要对多维列表的每个子列表执行 步骤 1 或 2。
当然横向多维列表有几种方法,你可以map
或filter
或reduce
或pass them as *arguments
等(横向多维列表的方法太多了我无法计数,你可以在这个网站上找到大部分方法)但是你选择的方法与你的例子紧密相关。如果没有进一步的解释,我不敢咨询你,因为它可能会造成更大的伤害和好处。
希望对您有所帮助。
需要帮助。 我有 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]
如果我完全理解它,您想要查找出现次数而不是找到特定数据的索引列表。我可以想象有几种方法可以做到这一点:
- 方式:,统计数据
如果你的数据类型不是多维列表,那么你可以简单地在列表对象中使用计数函数。
# 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
返回重复索引:
#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)
多维列表:
如我所见,您必须首先将整个列表转储到 1 个列表中,或者,根据需要对多维列表的每个子列表执行 步骤 1 或 2。
当然横向多维列表有几种方法,你可以map
或filter
或reduce
或pass them as *arguments
等(横向多维列表的方法太多了我无法计数,你可以在这个网站上找到大部分方法)但是你选择的方法与你的例子紧密相关。如果没有进一步的解释,我不敢咨询你,因为它可能会造成更大的伤害和好处。
希望对您有所帮助。