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 № 1W razie potrzeby użyj wszystkich wartości procentowych value_counts
z normalize=True
dla 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
- True
s są przetwarzane jak 1
s:
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