String 计算数据帧行中存在值A的次数、值B的次数以及值A和B的次数
我有一个数据帧“dfTags”,有140.000行(全部小写),列“tags”中逗号分隔的值的数量可以从71到1。但是列标记是一个字符串,Pandas不知道数组或列表:String 计算数据帧行中存在值A的次数、值B的次数以及值A和B的次数,string,pandas,dataframe,count,delimiter-separated-values,String,Pandas,Dataframe,Count,Delimiter Separated Values,我有一个数据帧“dfTags”,有140.000行(全部小写),列“tags”中逗号分隔的值的数量可以从71到1。但是列标记是一个字符串,Pandas不知道数组或列表: index tags 0 a, b, c, aa, bb, 2019 1 a, d, 18, gb 2 aa, a, dd, fb, la 3 aa, d, ddaa, b, k, l 以及一组“tagTuples”,其中包含850.000个排序元组(全部小写),由每行中的标记生成,如: (a,
index tags
0 a, b, c, aa, bb, 2019
1 a, d, 18, gb
2 aa, a, dd, fb, la
3 aa, d, ddaa, b, k, l
以及一组“tagTuples”,其中包含850.000个排序元组(全部小写),由每行中的标记生成,如:
(a, b), (b, c), (aa, c), (aa, bb), (2019, bb), (a, d), (18, d), (18, gb), (a, aa), (a, dd), (dd, fb), (fb, la), (aa, d), (d, ddaa), ...
我使用集合是因为我删除了每个只出现一次的标记,然后添加了每个创建的元组,自动删除了重复项
对于“tagTuples”中的每个元组,我需要:
- e、 g.(a,b)
- “标记”列中有多少行包含“a”?(三)
- 列“标记”中有多少行包含“a”也包含“b”?(一)
- =1/3=>0,33
- “标记”列中有多少行包含“b”?(二)
- 列“tags”中有多少行包含“b”也包含“a”?(一)
- =1/2=>0,5 导致边缘权重介于ab=(0,33+0,5)*100=83%(修改的Jaccard指数)之间
dfTagTuple = pd.DataFrame(columns=["Source", "Target", "Weight"])
其中,源=元组[0],目标=元组[1],权重=边权重
所以我得到了每个标签之间的边连接和边权重,以在Gephi中可视化它们,创建一个标签网络
但是标记类型为“object”,因为熊猫不知道数组。那么,当我检查行[“tags”]是否包含“a”时,如何在不计算“aa”/“ddaa”/“la”的情况下检查该公式的每个元组呢
我如何执行这4个检查,并以性能良好的方式获得每个元组的最终结果(0833..)
def calc_distance(tagLeft, tagRight):
# how many times does "a" appear in tags per row?
onlyTagLeft = ??
# # how many times does "b" appear in tags per row?
onlyTagRight = ??
# how many times does "a" and "b" appear together in tags per row?
bothTags = ??
edgeWeight = ((bothTags / onlyTagLeft) + (bothTags / onlyTagRight)) * 100
# print(tagLeft, "#", tagRight, edgeWeight)
print("{}: {}, {}: {}, bothTags: {}, weight: {}".format(tagLeft, onlyTagLeft, tagRight, onlyTagRight, bothTags,
edgeWeight))
df = pd.DataFrame([["a, b, c, aa, bb, 2019"], ["a, d, 18, gb"], ["aa, a, dd, fb, la"], ["aa, d, ddaa, b, k, l"]], columns=["tags"])
tagSet = {('aa', 'd'), ('a', 'aa'), ('a', 'd'), ('a', 'b')}
for tagTuple in tagSet:
calc_distance(tagTuple[0], tagTuple[1])
这不是一个完整的答案,但它会告诉您,对于每个Tagtuple(
tt
),tt的第一个元素出现了多少次,以及它们都出现了多少次,然后您可以进行计算
import pandas as pd
df = pd.DataFrame({'tags': [['a', 'b', 'c', 'aa'], ['a', 'd'], ['aa', 'a', 'dd']]})
tt = [('a', 'b'), ('aa', 'c')]
for t in tt:
el_1 = t[0]
el_2 = t[1]
only_el_1 = df.tags.apply(lambda x: el_1 in x).sum()
both_el = df.tags.apply(lambda x: (el_1 in x) and (el_2 in x)).sum()
print("First element of tupple {} is contained {} times and the both elements are contained {} times".format(t,
only_el_1,
both_el))
希望有帮助列“tags”是单个字符串,熊猫不知道列表或数组。在你的情况下,计算“a”也算“aa”。扩展我的问题以消除不确定性。