加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何使用python pandas从csv文件中获取集合的交集

发布时间:2020-12-20 13:46:52 所属栏目:Python 来源:网络整理
导读:我有一个csv文件,其中有4列和1200行. 行中的值为1,0. 4列= setA,setB,setC,setD 我需要找到所有可能的 ?n(setA == 1),n(setB == 1),n(setC == 1),n(setD == 1),n(setA ==1∩setB== 1),n(setA == 1∩setB==1∩setC== 1)……. 目前我正在使用它,但它痛苦,耗时
我有一个csv文件,其中有4列和1200行.

行中的值为1,0.

4列= setA,setB,setC,setD

我需要找到所有可能的
?n(setA == 1),n(setB == 1),n(setC == 1),n(setD == 1),n(setA ==1∩setB== 1),n(setA == 1∩setB==1∩setC== 1)…….

目前我正在使用它,但它痛苦,耗时和令人困惑:

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 query method:

csv_pd.query('setA==1 & setB==0 & setC==0').groupby('D').count()

另请注意,您可以将列名称传递给groupby,而不是Series值.因此,groupby(‘D’)而不是groupby(csv_pd.D).

要计算所有可能子集的大小,powerset recipe和itertools.product会有所帮助:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读