鉴于Pandas Dataframe如下:
value_1 value_2
0 b a
1 a b
2 c d
3 d c
尽管有秩序,但我想计算每对发生多少次。换句话说,a,b等于b,a。我发现了一些情况,比如that,但在这种情况下,预计某些值只出现在一列中。
首先,我尝试类似的东西:
pd.crosstab(df.value_1,df.value_2).replace(0,np.nan).\
stack().reset_index().rename(columns={0:'Frequency'})
通过这种方法我也无法删除重复项考虑到(a,b == b, a)
的顺序
然后我假设像[(a,b), (b,a), (c,d), (d,c)]
这样的列表的情况,所以我创建了一个函数,只根据它们的元素返回单对:
from itertools import combinations
def get_unique_pairs(pairs):
unique_pairs = []
for pair in combinations(pairs, 2):
if Counter(pair[0]) == Counter(pair[1]):
unordered_pair = set(list(pair[0]+pair[1]))
unique_pairs.append(unordered_pair)
return {(tuple(e)) for e in unique_pairs}
他们对[(a,b), (b,a), (c,d), (d,c)]
的输出是{(a,b), (c,d)}
但是,对于大型数据帧来说,这是不可行的。
最后,对于上述数据帧,预期输出为:
pair frequency
0 b; a 2
1 c; d 2