web-dev-qa-db-ja.com

データフレームの列でTrue / Falseの発生をカウントします

DataFrameをループすることなく、列内のブール値の発生数をカウントする方法はありますか?

のようなことをしています

df[df["boolean_column"]==False]["boolean_column"].sum()

Falseの値は0であるため機能しません。したがって、ゼロの合計は常に0を返します。

当然、列をループしてチェックすることで出現回数を数えることができますが、Pythonでこれを行う方法があるかどうかを知りたいと思いました。

5
Luca Giorgi

pd.Series.value_counts() を使用:

_>> df = pd.DataFrame({'boolean_column': [True, False, True, False, True]})
>> df['boolean_column'].value_counts()
True     3
False    2
Name: boolean_column, dtype: int64
_

FalseTrueを別々にカウントする場合は、pd.Series.sum() + _~_を使用できます。

_>> df['boolean_column'].values.sum()  # True
3
>> (~df['boolean_column']).values.sum() # False
2
_
2
user3471881

あなたは単に合計することができます:

sum(df["boolean_column"])

これにより、「True」要素の数がわかります。

len(df["boolean_column"]) - sum(df["boolean_column"])

「False」要素の数を生成します。

1
FMarazzi

パンダでは、自然な方法は value_counts

df = pd.DataFrame({'A': [True, False, True, False, True]})

print(df['A'].value_counts())

# True     3
# False    2
# Name: A, dtype: int64

TrueまたはFalseの値を個別に計算するには、True/Falseと明示的に比較せず、sumのみを比較して、逆ブール値を取得します~False値をカウントするには:

print(df['A'].sum())     # 3
print((~df['A']).sum())  # 2

boolintのサブクラスであり、この動作はPandas series/NumPy配列にも当てはまります。

または、NumPyを使用してカウントを計算できます。

print(np.unique(df['A'], return_counts=True))

# (array([False,  True], dtype=bool), array([2, 3], dtype=int64))
1
jpp

この代替方法は、複数の列や行に対しても機能します。

_df[df==True].count(axis=0)
_

列ごとのTrue値の合計量を取得します。行単位のカウントの場合は、_axis=1_を設定します。

_df[df==True].count().sum()
_

最後にsum()を追加すると、DataFrame全体の合計が得られます。

0
Jakob

ブール値を持つDataFrameに列がある場合、またはさらに興味深い場合は、それがなくても特定の条件を満たす列の値の数を見つけたい場合は、次のようなことを試すことができます(私が使用した例<=):

(df['col']<=value).value_counts()

括弧は、他の計算にも使用できるTrue/False値の#を持つタプルを作成します。追加の変数を作成しなくても、Falseカウントの[0]とTrueカウントの[1]を追加するタプルにアクセスします。

(df['col']<=value).value_counts()[0] #for falses
(df['col']<=value).value_counts()[1] #for trues
0
Andrea Grianti