web-dev-qa-db-fra.com

obtenir le nombre de lignes de trame de données en fonction des conditions

Je veux obtenir le nombre de lignes de trame de données en fonction de la sélection conditionnelle. J'ai essayé le code suivant.

print df[(df.IP == head.idxmax()) & (df.Method == 'HEAD') & (df.Referrer == '"-"')].count()

sortie:

IP          57
Time        57
Method      57
Resource    57
Status      57
Bytes       57
Referrer    57
Agent       57
dtype: int64

La sortie affiche le nombre pour chacune des colonnes de la trame de données. Au lieu de cela, je dois obtenir un seul décompte où toutes les conditions ci-dessus sont remplies? Comment faire ça? Si vous avez besoin de plus d'explications sur mon dataframe, veuillez me le faire savoir.

39
Nilani Algiriyage

Vous demandez la condition où toutes les conditions sont vraies, donc le cadre est la réponse, à moins que je ne comprenne mal ce que vous demandez

In [17]: df = DataFrame(randn(20,4),columns=list('ABCD'))

In [18]: df[(df['A']>0) & (df['B']>0) & (df['C']>0)]
Out[18]: 
           A         B         C         D
12  0.491683  0.137766  0.859753 -1.041487
13  0.376200  0.575667  1.534179  1.247358
14  0.428739  1.539973  1.057848 -1.254489

In [19]: df[(df['A']>0) & (df['B']>0) & (df['C']>0)].count()
Out[19]: 
A    3
B    3
C    3
D    3
dtype: int64

In [20]: len(df[(df['A']>0) & (df['B']>0) & (df['C']>0)])
Out[20]: 3
56
Jeff

Pour des performances accrues, vous ne devez pas évaluer la trame de données à l'aide de votre prédicat. Vous pouvez simplement utiliser le résultat de votre prédicat directement comme illustré ci-dessous:

In [1]: import pandas as pd
        import numpy as np
        df = pd.DataFrame(np.random.randn(20,4),columns=list('ABCD'))


In [2]: df.head()
Out[2]:
          A         B         C         D
0 -2.019868  1.227246 -0.489257  0.149053
1  0.223285 -0.087784 -0.053048 -0.108584
2 -0.140556 -0.299735 -1.765956  0.517803
3 -0.589489  0.400487  0.107856  0.194890
4  1.309088 -0.596996 -0.623519  0.020400

In [3]: %time sum((df['A']>0) & (df['B']>0))
CPU times: user 1.11 ms, sys: 53 µs, total: 1.16 ms
Wall time: 1.12 ms
Out[3]: 4

In [4]: %time len(df[(df['A']>0) & (df['B']>0)])
CPU times: user 1.38 ms, sys: 78 µs, total: 1.46 ms
Wall time: 1.42 ms
Out[4]: 4

Gardez à l'esprit que cette technique ne fonctionne que pour compter le nombre de lignes conformes à votre prédicat.

6
Enias Cailliau