Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用熊猫统计大数据中的条目_Python_Pandas - Fatal编程技术网

Python 使用熊猫统计大数据中的条目

Python 使用熊猫统计大数据中的条目,python,pandas,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

我正在使用选项卡分隔的文件:

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对这些数据进行排序:

df = pd.read_csv('file.txt', delimiter= '\t', names = ['A', 'B', 'C', 'D']) 
df1.groupby(['a', 'c', 'd', 'e']).count()
但它不会返回期望的结果

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

说明

  • 用于将所有列(除了
    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
    ...
    
  • 然后您可以选择
    A
    列:

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

    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
    
逐步直觉:

  • 基于列
    A
    将每个组展平到一个列表中进行分组。我还将组名转换为带有出现次数的列表
  • 形成最终数据帧的原型。首先使用python build int
    count
    计算每个列表中每个元素的出现次数,并使用
    generator
    形成所需的数据结构。最后用
    0
    填充
    NaN
  • DataFrame
    原型转换为我们想要的方式

  • 很不错的!如果您还想包括
    A
    列的计数(如原件中所示)?@unutbu谢谢,这与我要查找的非常接近,如果我们还想包括'A'列中的条目计数,如我最初的问题“A 4 c 2 v 1??有什么建议吗?您可以使用
    结果['A']计算这些值吗=df.groupby('A')['A'].count()
    。我已经编辑了上面的文章以显示结果。
    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)
    
    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']]
    
    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
    
    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