/ / Uzyskaj procent wierszy (łańcuchów), które spełniają pewien warunek w ramce danych pandy - python, pandy, pandy-groupby

Uzyskaj procent wierszy (łańcuchów), które spełniają pewien warunek w ramce danych pandy - python, pandy, pandy-groupby

Mam tę ramkę danych:

df = pd.DataFrame({"A": ["Used", "Not used", "Not used", "Not used", "Used",
"Not used", "Used", "Used", "Used", "Not used"],
"B": ["Used", "Used", "Used", "Not used", "Not used",
"Used", "Not used", "Not used", "Used", "Not used"]})

Chciałbym znaleźć najszybszy, najczystszy sposób, aby dowiedzieć się, co następuje:

  • Procent wierszy wszystkich wierszy, w których użyto A.
  • Procent wierszy wszystkich wierszy, w których użyto B.
  • Procent wierszy we wszystkich wierszach, w których użyto A i B.

Jestem nowy w Pythonie i pandach (i kodowaniu wogólnie), więc jestem pewien, że jest to bardzo proste, ale wszelkie wskazówki byłyby doceniane. Próbowałem groupby (). Aggregate (suma), ale nie otrzymałem wyniku, którego potrzebowałem (wyobrażałem sobie, ponieważ są to raczej znaki niż liczby całkowite.

Odpowiedzi:

8 dla odpowiedzi № 1

W razie potrzeby użyj wszystkich wartości procentowych value_counts z normalize=Truedla wielu kolumn groupby z size dla długości wszystkich par i podziel go przez length of df (taki sam jak długość indeksu):

print (100 * df["A"].value_counts(normalize=True))
Not used    50.0
Used        50.0
Name: A, dtype: float64

print (100 * df["B"].value_counts(normalize=True))
Not used    50.0
Used        50.0
Name: B, dtype: float64

print (100 * df.groupby(["A","B"]).size() / len(df.index))
A         B
Not used  Not used    20.0
Used        30.0
Used      Not used    30.0
Used        20.0
dtype: float64

Jeśli potrzebujesz wartości filtru, stwórz maskę i pobierz mean - Trues są przetwarzane jak 1s:

print (100 * df["A"].eq("Used").mean())
#alternative
#print (100 * (df["B"] == "Used").mean())
50.0

print (100 * df["B"].eq("Used").mean())
#alternative
#print (100 * (df["B"] == "Used").mean())
50.0

print (100 * (df["A"].eq("Used") & df["B"].eq("Used")).mean())
20.0

5 dla odpowiedzi nr 2

Posługiwać się

1) Używane A

In [4929]: 100.*df.A.eq("Used").sum()/df.shape[0]
Out[4929]: 50.0

2) Używane B

In [4930]: 100.*df.B.eq("Used").sum()/df.shape[0]
Out[4930]: 50.0

3) Używane A i Używane B

In [4931]: 100.*(df.B.eq("Used") & df.A.eq("Used")).sum()/df.shape[0]
Out[4931]: 20.0

1) jest taki sam jak

In [4933]: 100.*(df["A"] == "Used").sum()/len(df.index)
Out[4933]: 50.0