J'ai un dataframe similaire à
df = pd.DataFrame({'A': [1, np.nan,2,3, np.nan,4], 'B': [np.nan, 1,np.nan,2, 3, np.nan]})
df
A B
0 1.0 NaN
1 NaN 1.0
2 2.0 NaN
3 3.0 2.0
4 NaN 3.0
5 4.0 NaN
Comment compter le nombre d'occurrences de A est np.nan mais B pas np.nan , A pas np.nan mais B est np.nan , et A et B ne sont pas tous deux np.nan ? p>
J'ai essayé df.groupby (['A', 'B']). count () mais il ne lit pas les lignes avec np.nan code >.
5 Réponses :
Je pense que vous avez besoin de:
3 1 2
Résultat:
df = pd.DataFrame({'A': [1, np.nan,2,3, np.nan,4], 'B': [np.nan, 1,np.nan,2, 3, np.nan]})
count1 = len(df[(~df['A'].isnull()) & (df['B'].isnull())])
count2 = len(df[(~df['A'].isnull()) & (~df['B'].isnull())])
count3 = len(df[(df['A'].isnull()) & (~df['B'].isnull())])
print(count1, count2, count3)
Si nous ne traitons que deux colonnes, il existe une solution très simple qui consiste à attribuer des poids simples aux colonnes A et B, puis à les additionner.
df.isna().pivot_table(index='A', columns='B', aggfunc='size').stack()
A B
False False 1.0
True 3.0
True False 2.0
dtype: float64
Une autre alternative avec
code> pivot_table et stack peuvent être obtenus par,
v = df.isna().mul([1, 2]).sum(1).value_counts()
v.index = v.index.map({2: 'only B', 1: 'only A', 0: 'neither'})
v
only B 3
only A 2
neither 1
dtype: int64
Utilisation de
df.isnull().groupby(['A','B']).size()
Out[541]:
A B
False False 1
True 3
True False 2
dtype: int64
Vous pouvez utiliser DataFrame .isna avec tableau croisé pour les valeurs de count Trues:
df = pd.DataFrame({'A': [1, np.nan,2,3, np.nan,4, np.nan],
'B': [np.nan, 1,np.nan,2, 3, np.nan, np.nan]})
s = df.isna().dot(df.columns).replace({'':'no match'}).value_counts()
print (s)
B 3
A 2
no match 1
AB 1
dtype: int64
Pour scalaire:
print (df2.loc['A_False', 'B_False']) 1
df2 = pd.crosstab(df1.A, df1.B).add_prefix('B_').rename(lambda x: 'A_' + str(x))
print (df2)
B B_False B_True
A
A_False 1 3
A_True 2 0
Pour obtenir des lignes où A ou B est nul, nous pouvons faire:
df[bool_df['A'] & bool_df['B']].shape[0]
Pour obtenir des lignes où les deux sont des valeurs nulles:
bool_df = df.isnull() df[bool_df['A'] ^ bool_df['B']].shape[0]
1) Quelle devrait être la sortie de vos données?
2) IOW, vous ne voulez exclure que les lignes où A et B sont NaN?
^ oui je n'ai pas ce type de ligne dans mon dataframe