用熊猫计算大数据中的条目

时间:2016-06-04 23:06:06

标签: python pandas

我正在使用制表符分隔文件:

A    B    C    D
a    d    ii   do 
a    d    g    do
a    h    g    do
a    i    k    mo
c    i    k    mo
c    g    ii   mo
v    g    p    do

我想计算第一列中的每个条目以及第二,第三和第四列中的所有相关条目,如:

a 4 d 2 h 1 i 1 ii 1 k 1 domain 3 motif 1
c 2 i 1 g 1 k 1 ii 1 motif 2 
v 1 g 1 p 1 motif 1

我试图通过这些命令用python pandas对这些数据进行排序:

df = pd.read_csv('file.txt', delimiter= '\t', names = ['A', 'B', 'C', 'D']) 
df1.groupby(['a', 'c', 'd', 'e']).count()

但它没有返回所需的结果。

2 个答案:

答案 0 :(得分:4)

import pandas as pd
df = pd.DataFrame({'A': ['a', 'a', 'a', 'a', 'c', 'c', 'v'],
                   'B': ['d', 'd', 'h', 'i', 'i', 'g', 'g'],
                   'C': ['ii', 'g', 'g', 'k', 'k', 'ii', 'p'],
                   'D': ['domain', 'domain', 'domain', 'motif', 
                         'motif', 'motif', 'domain']})

melted = pd.melt(df, id_vars='A')
count = melted.groupby(['A', 'value'])['value'].count()
result = count.unstack(fill_value=0)
result['A'] = df.groupby('A')['A'].count()
print(result)

产量

value  d  domain  g  h  i  ii  k  motif  p  A
A                                            
a      2       3  2  1  1   1  1      1  0  4
c      0       0  1  0  1   1  1      2  0  2
v      0       1  1  0  0   0  0      0  1  1

<强>解释

  • 使用pd.melt将所有列(A列除外)合并为一列:

    In [517]: melted = pd.melt(df, id_vars='A'); melted
    Out[517]: 
        A variable   value
    0   a        B       d
    1   a        B       d
    2   a        B       h
    3   a        B       i
    4   c        B       i
    ...
    
  • 然后您可以groupby/count Avalue列:

    In [520]: count = melted.groupby(['A', 'value'])['value'].count(); count
    Out[520]: 
    A  value 
    a  d         2
       domain    3
       g         2
       h         1
    ...
    
  • count.unstack('value')value索引级别移动到列索引级别:

    In [522]: count.unstack('value', fill_value=0)
    Out[522]: 
    value  d  domain  g  h  i  ii  k  motif  p
    A                                         
    a      2       3  2  1  1   1  1      1  0
    c      0       0  1  0  1   1  1      2  0
    v      0       1  1  0  0   0  0      0  1
    

答案 1 :(得分:1)

import pandas as pd
df = pd.DataFrame({'A': ['a', 'a', 'a', 'a', 'c', 'c', 'v'],
                   'B': ['d', 'd', 'h', 'i', 'i', 'g', 'g'],
                   'C': ['ii', 'g', 'g', 'k', 'k', 'ii', 'p'],
                   'D': ['domain', 'domain', 'domain', 'motif', 
                         'motif', 'motif', 'domain']})

n = [name for name,g in df.groupby('A')] # remember the index names
d= [[name]*g['A'].count() + g[['B','C','D']].values.flatten().tolist() for name, g in df.groupby('A')]
rslt = pd.DataFrame([dict((x,r.count(x)) for x in r) for r in d]).fillna(0)

rslt['count'] = rslt[n].sum(axis=1)
rslt.set_index(pd.Index(n), inplace=True)
rslt.drop(n, axis=1, inplace=True)

一步一步直觉:

  
      
  1. 将基于列Aflatten的每个组添加到列表中。我还将组名转换为具有出现次数的列表。
  2.   
d
Out[138]: 
[['a',
  'a',
  'a',
  'a',
  'd',
  'ii',
  'domain',
  'd',
  'g',
  'domain',
  'h',
  'g',
  'domain',
  'i',
  'k',
  'motif'],
 ['c', 'c', 'i', 'k', 'motif', 'g', 'ii', 'motif'],
 ['v', 'g', 'p', 'domain']]
  
      
  1. 形成最终DataFrame的原型。首先使用python build-int count计算每个列表中每个元素的出现次数,并使用generator形成所需的数据结构。最后使用NaN填充0
  2.   
pd.DataFrame([dict((x,r.count(x)) for x in r) for r in d]).fillna(0)
Out[141]:
   a  c  d  domain  g  h  i  ii  k  motif  p  v
0  4  0  2       3  2  1  1   1  1      1  0  0
1  0  2  0       0  1  0  1   1  1      2  0  0
2  0  0  0       1  1  0  0   0  0      0  1  1
  
      
  1. DataFrame原型转换为我们想要的方式
  2.   
rslt
Out[143]: 
   d  domain  g  h  i  ii  k  motif  p  count
a  2       3  2  1  1   1  1      1  0      4
c  0       0  1  0  1   1  1      2  0      2
v  0       1  1  0  0   0  0      0  1      1