Ich habe einen Datenrahmen wie den folgenden:

data:

    items   status
0   jet     fail
1   car     fail
2   car     pass
3   bike    fail
4   car     fail
5   jet     fail
6   bike    pass
7   jet     fail
8   jet     fail
9   bike    pass

Ich möchte die Daten nach items gruppieren und einen neuen Datenrahmen mit der Anzahl der einzelnen Werte erstellen. Erwartete Ausgabe:

df:
  unique  count  pass  fail
0    jet      4     0     4
1    car      3     1     2
2   bike      3     2     1

Eine Methode wäre nun, eine Liste mit eindeutigen items abzurufen und diese zu durchlaufen, um die count, pass und fail zu finden und diese Listen dann zu einem Datenrahmen zu kombinieren Aber wie kann ich das effizient machen?

1
Rahul Sharma 31 Aug. 2020 im 14:54

2 Antworten

Beste Antwort

Verwenden Sie crosstab mit < a href = "http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rename_axis.html" rel = "nofollow noreferrer"> DataFrame.rename_axis für new Indexname, dann neue Spalte für 0 position durch DataFrame.insert und konvertiere den Index zuletzt in eine Spalte von DataFrame.reset_index:

df = pd.crosstab(df['items'], df['status']).rename_axis(columns=None, index='unique')
df.insert(0, 'count', df.sum(axis=1))
df = df.reset_index()
print (df)
  unique  count  fail  pass
0   bike      3     1     2
1    car      3     2     1
2    jet      4     4     0

Wenn count die letzte Spalte sein soll, verwenden Sie den Parameter margin und entfernen Sie die letzte Zeile:

df = (pd.crosstab(df['items'], df['status'], 
                  margins=True, 
                  margins_name='count')
       .rename_axis(columns=None, index='unique')
       .iloc[:-1]
       .reset_index())
print (df)
  unique  fail  pass  count
0   bike     1     2      3
1    car     2     1      3
2    jet     4     0      4
3
jezrael 31 Aug. 2020 im 12:06

Sie können die Werte separat abrufen und mit pd.concat kombinieren:

A = df.groupby("items").size().rename("count")
A
items
bike    3
car     3
jet     4
Name: count, dtype: int64

B = (
    df.groupby(["items", "status"])
    .size()
    .unstack(fill_value=0)
    .rename_axis(columns=None)
)
B
      fail  pass
items       
bike    1   2
car     2   1
jet     4   0


pd.concat((A, B), axis=1).reset_index()

   items    count   fail    pass
0   bike    3        1      2
1   car     3        2      1
2   jet     4        4      0
0
sammywemmy 31 Aug. 2020 im 12:08