2014-12-31 60 views
4

我有一個csv文件,其中有4列,1200行。如何使用python熊貓獲取csv文件的集合

行中的值爲1,0。

的4列=組A,組B,國家經貿委,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

回答

1

避免一個班輪將提高可讀性,使之少一些困惑:

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而不是系列值。因此,groupby('D')而不是groupby(csv_pd.D)


計算所有可能的子集的大小,powerset recipeitertools.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