簡體   English   中英

如何使用python pandas從csv文件中獲取集合的交集

[英]How to use python pandas to get intersection of sets from a csv file

我有一個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.htmlhttps://github.com/benfred/venn.js/樹/主

避免單行將提高可讀性,使其更容易混淆:

mask = (csv_pd.setA==1) & (csv_pd.setB==0) & (csv_pd.setC==0)
csv_pd[mask].groupby('D').count()

另一種可能性,恰好是單行,是使用query方法

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

另請注意,您可以將列名稱傳遞給groupby ,而不是Series值。 因此, groupby('D')而不是groupby(csv_pd.D)


要計算所有可能子集的大小, powerset配方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,2,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, v in zip(cols,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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM