如何使用python pandas从csv文件中获取集合的交集
我有一个csv文件,其中有4列和1200行.
行中的值为1,0. 4列= setA,setB,setC,setD 我需要找到所有可能的 目前我正在使用它,但它痛苦,耗时和令人困惑: csv_pd[(csv_pd.setA==1) & (csv_pd.setB==0) & (csv_pd.setC==0)].groupby(csv_pd.D).count() 这基本上是找到n(setA∩setD) 是否有一个更好的一个班轮,可以正确地转储我需要的所有数据而不会如此繁琐. 我需要所有这些数据,因为我根据http://benfred.github.io/venn.js/examples/intersection_tooltip.html,https://github.com/benfred/venn.js/tree/master生成这些集合的维恩图 解决方法
避免单行将提高可读性,使其更容易混淆:
mask = (csv_pd.setA==1) & (csv_pd.setB==0) & (csv_pd.setC==0) csv_pd[mask].groupby('D').count() 另一种可能性,恰好是单行,是使用the csv_pd.query('setA==1 & setB==0 & setC==0').groupby('D').count() 另请注意,您可以将列名称传递给groupby,而不是Series值.因此,groupby(‘D’)而不是groupby(csv_pd.D). 要计算所有可能子集的大小, import itertools as IT import numpy as np import pandas as pd def powerset(iterable,reverse=False,rvals=None): """powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,3)""" s = list(iterable) N = len(s) if rvals is None: rvals = range(N,-1,-1) if reverse else range(N + 1) return IT.chain.from_iterable( IT.combinations(s,r) for r in rvals) df = pd.DataFrame(np.random.randint(2,size=(10,4)),columns=list('ABCD')) print(df) for cols in powerset(df.columns): if not cols: continue for vals in IT.product([0,1],repeat=len(cols)): mask = np.logical_and.reduce([df[c]==v for c,v in zip(cols,vals)]) cond = ' & '.join(['{}={}'.format(c,v) for c,vals)]) n = len(df[mask]) print('n({}) = {}'.format(cond,n)) 产量 n(A=0) = 8 n(A=1) = 2 n(B=0) = 4 n(B=1) = 6 ... n(A=0 & B=0) = 4 n(A=0 & B=1) = 4 n(A=1 & B=0) = 0 ... n(A=1 & B=1 & C=0 & D=0) = 0 n(A=1 & B=1 & C=0 & D=1) = 1 n(A=1 & B=1 & C=1 & D=0) = 0 n(A=1 & B=1 & C=1 & D=1) = 1 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |