Python中多行中非零值的计数?

时间:2017-01-05 18:22:45

标签: python pandas

我需要在行对中计算非零变量。

我有一个数据框,列出了在几个采样点发现的物种密度。我需要知道每对采样点的物种总数。以下是我的数据示例:

>>> import pandas
>>> df = pd.DataFrame({'ID':[111,222,333,444],'minnow':[1,3,5,4],'trout':[2,0,0,3],'bass':[0,1,3,0],'gar':[0,1,0,0]})
>>> df
    ID  bass  gar  minnow  trout
0  111     0    0       1      2
1  222     1    1       3      0
2  333     3    0       5      0
3  444     0    0       4      3

我将按ID号对行进行配对,因此对(111,222)应该返回总共4,而对(111,333)应该总共返回3.我知道我可以得到一个非零的总和每一行,但如果我为每一对添加这些总数,我将重复计算一些物种。

3 个答案:

答案 0 :(得分:1)

以下是使用NumPy的方法 -

In [35]: df
Out[35]: 
    ID  bass  gar  minnow  trout
0  111     0    0       1      2
1  222     1    1       3      0
2  333     3    0       5      0
3  444     0    0       4      3

In [36]: a = df.iloc[:,1:].values!=0

In [37]: r,c = np.triu_indices(df.shape[0],1)

In [38]: l = df.ID

In [39]: pd.DataFrame(np.column_stack((l[r], l[c], (a[r] | a[c]).sum(1))))
Out[39]: 
     0    1  2
0  111  222  4
1  111  333  3
2  111  444  2
3  222  333  3
4  222  444  4
5  333  444  3

答案 1 :(得分:0)

如果对行进行排序以便两个组一个接一个地出现,则可以执行

import pandas as  pd
import numpy as np

x = np.random.randint(0,2,(10,3))

df = pd.DataFrame(x)

pair_a = df.loc[::2].reset_index(drop = True)
pair_b = df.loc[1::2].reset_index(drop = True)


paired = pd.concat([pair_a,pair_b],axis = 1)

然后找到paired非零的位置。

答案 2 :(得分:0)

你可以使用iloc进行切片和numpy

np.sum((df.iloc[[0, 1], 1:]!=0).any(axis=0))

这里df.iloc [[0,1],1:]给出前两行,numpy sum计算所选行中非零对的总数。您可以使用df.iloc [[0,1],1:]来选择任何行组合。