簡體   English   中英

Python中多行中非零值的計數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM