我有这样的数据集:
user_id location
2222 23
2222 23
2222 24
2222 23
3333 24
3333 24
3333 24
我想在“location”中找到每个不同“user_id”的值的频率。但是我不希望整个专栏都有频率。只想显示每个项目的位置。
结果应该是这样的新列:
user_id location frequency
2222 23 1
2222 23 2
2222 24 1
2222 23 1
3333 24 1
3333 24 2
3333 24 3
答案 0 :(得分:1)
如果你有像这样的元组数组
tupleArray = [(2222,23),(2222,23)...]
您可以构建另一个frecuency数组并检查之前的值是否相同以增加值
tupleArray = [(2222,23),(2222,23),(2222,24),(2222,23),(3333,24),(3333,24),(3333,24)]
frecuencyArray = []
tempValue = 1
for x in range(len(tupleArray)):
if (x-1>=0 and tupleArray[x][1]==tupleArray[x-1][1]):
tempValue = tempValue +1
else:
tempValue=1
frecuencyArray.append(tempValue)
print(frecuencyArray)
测试代码:
答案 1 :(得分:1)
不确定我是否完全理解你的问题,但会在之前给出。
dataset = [
(2222, 23),
(2222, 23),
(2222, 24),
(2222, 23),
(3333, 24),
(3333, 24),
(3333, 24),
]
feq = {}
ret = []
for usr_id, loc_id in dataset:
key = '{}.{}'.format(usr_id, loc_id)
feq.setdefault(key, 0)
feq[key] += 1
ret.append((usr_id, loc_id, feq[key]))
ret的内容是:
[(2222, 23, 1),
(2222, 23, 2),
(2222, 24, 1),
(2222, 23, 3),
(3333, 24, 1),
(3333, 24, 2),
(3333, 24, 3)]
答案 2 :(得分:1)
请粘贴一个实际的python数据对象定义,而不是打印输出
d = """2222 23
2222 23
2222 24
2222 23
3333 24
3333 24
3333 24"""
d = [*map(lambda x: [*map(int, x.split())], d.split('\n'))]
d
Out[89]:
[[2222, 23],
[2222, 23],
[2222, 24],
[2222, 23],
[3333, 24],
[3333, 24],
[3333, 24]]
然后
df, c = [], 0
for a, b in zip(d, [d[0]] + d):
c = c*(a == b) + 1 # count with reset if lagged b value != a
df.append(a + [c])
df
Out[90]:
[[2222, 23, 1],
[2222, 23, 2],
[2222, 24, 1],
[2222, 23, 1],
[3333, 24, 1],
[3333, 24, 2],
[3333, 24, 3]]
答案 3 :(得分:0)
标准库为这种情况提供了Counter
类。
from collections import Counter
frequencies = Counter((user_id, location) for user_id, location in data)
这将提供从每个user_id
/ location
对到它们一起出现的次数的地图。
要将此数据传输回矩阵格式,请尝试以下代码段:
new_table = []
for (user_id, location), frequency in frequencies.items():
new_table.append([user_id, location, frequency])
这是一个demo,因此您可以看到它的实际效果。