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

Python中多行中非零值的计数?,python,pandas,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 ba

我需要一对行中的非零变量计数

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

>>> 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号对这些行进行配对,因此该对(111222)应总共返回4,而该对(111333)应总共返回3。我知道我可以为每一行得到一个非零的总和,但是如果我为每一对加上这些总数,我将重复计算一些物种

这里有一种使用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

如果对行进行排序,使两个组依次出现,则可以执行以下操作:

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)

然后找到配对的为非零的位置。

您可以使用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:]选择任何行组合。

您可以发布所需的数据集吗?每对的输出将合并到一个循环公式中,因此我可以为每对获取一个整数变量,然后在每次循环重复时重新计算它。或者,我可以一次计算所有对,并将输出保存到一个数据帧,然后从该数据帧中提取用于循环中的计算。当我在pd.dataframe(np.column_stack((l[r],l[c],(a[r]| a[c]).sum(1))中运行第72行:回溯(最近一次调用):文件“”,第1行)时,出现了一个错误名称错误:名称“l”不正确defined@TheresaBrown对不起,我忘了添加
l=df.ID
。刚刚编辑。检查它。1=df.ID返回了一个错误“无法分配到文字”,我尝试用d替换1,但现在我得到一个错误,它说“int”对象没有属性“getitem”@TheresaBrown,必须是
l
,就像在伦敦一样,不是数字
one
l=df.ID
。我仍然得到“int对象没有属性”get\u item“错误这是有效的!我将能够把它合并到循环中。非常感谢。