[英]Count of non-zero values in multiple rows in Python?
我需要對成對的非零變量進行計數。
我有一個數據框,列出了在幾個采樣點發現的物種密度。 我需要知道在每對采樣點發現的物種總數。 這是我的數據示例:
>>> 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。我知道我可以獲得每行的非零總和,但是如果我把每對的總數加起來,我就會重復計算一些物種。
這是 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)
然后找到paired
非零的地方。
您可以使用 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:] 來選擇行的任意組合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.