我需要在行对中计算非零变量。
我有一个数据框,列出了在几个采样点发现的物种密度。我需要知道每对采样点的物种总数。以下是我的数据示例:
>>> 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.我知道我可以得到一个非零的总和每一行,但如果我为每一对添加这些总数,我将重复计算一些物种。
答案 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:]来选择任何行组合。