wake-up-neo.net

Python Pandas: Konvertiert die Ausgabe von ".value_counts" in einen Datenrahmen

Hallo, ich möchte die Anzahl der eindeutigen Werte des Datenrahmens ermitteln. count_values ​​implementiert dies aber ich möchte seine Ausgabe woanders verwenden. Wie kann ich die .count_values-Ausgabe in einen Pandas-Datenrahmen konvertieren? Hier ist ein Beispielcode:

import pandas as pd
df = pd.DataFrame({'a':[1, 1, 2, 2, 2]})
value_counts = df['a'].value_counts(dropna=True, sort=True)
print(value_counts)
print(type(value_counts))

ausgabe ist:

2    3
1    2
Name: a, dtype: int64
<class 'pandas.core.series.Series'>

Was ich brauche, ist ein Datenrahmen wie folgt:

unique_values  counts
2              3
1              2

Vielen Dank. 

17
s900n

Verwenden Sie rename_axis für den Namen der Spalte aus dem Index und reset_index :

df = value_counts.rename_axis('unique_values').reset_index(name='counts')
print (df)
   unique_values  counts
0              2       3
1              1       2

Oder wenn Sie eine Spalte DataFrame benötigen, verwenden Sie Series.to_frame :

df = value_counts.rename_axis('unique_values').to_frame('counts')
print (df)
               counts
unique_values        
2                   3
1                   2
22
jezrael

Ich werde auch meinen Hut einwerfen, im Wesentlichen das gleiche wie bei @ wy-hsu, aber im Funktionsformat:

def value_counts_df(df, col):
    """
    Returns pd.value_counts() as a DataFrame

    Parameters
    ----------
    df : Pandas Dataframe
        Dataframe on which to run value_counts(), must have column `col`.
    col : str
        Name of column in `df` for which to generate counts

    Returns
    -------
    Pandas Dataframe
        Returned dataframe will have a single column named "count" which contains the count_values()
        for each unique value of df[col]. The index name of this dataframe is `col`.

    Example
    -------
    >>> value_counts_df(pd.DataFrame({'a':[1, 1, 2, 2, 2]}), 'a')
       count
    a
    2      3
    1      2
    """
    df = pd.DataFrame(df[col].value_counts())
    df.index.name = col
    df.columns = ['count']
    return df
0
Constantino

Ich bin gerade auf das gleiche Problem gestoßen und gebe hier meine Gedanken dazu.

Warnung

Wenn Sie sich mit der Datenstruktur von Pandas beschäftigen, müssen Sie den Rückgabetyp kennen.

Eine andere Lösung hier

Wie bereits erwähnt, bietet Pandas die API pd.Series.to_frame

Schritt 1

Sie können den pd.Series auch einfach in pd.DataFrame umschließen

df_val_counts = pd.DataFrame(value_counts) # wrap pd.Series to pd.DataFrame

Dann haben Sie einen pd.DataFrame mit dem Spaltennamen 'a' und Ihre erste Spalte wird zum Index

Input:  print(df_value_counts.index.values)
Output: [2 1]

Input:  print(df_value_counts.columns)
Output: Index(['a'], dtype='object')

Schritt 2

Was jetzt?

Wenn Sie hier als pd.DataFrame neue Spaltennamen hinzufügen möchten, können Sie den Index einfach über die API von reset_index () zurücksetzen.

Und dann ändern Sie den Spaltennamen durch eine Liste nach API df.coloumns

df_value_counts = df_value_counts.reset_index()
df_value_counts.columns = ['unique_values', 'counts']

Dann hast du was du brauchst

Output:

       unique_values    counts
    0              2         3
    1              1         2

Vollständige Antwort hier

import pandas as pd

df = pd.DataFrame({'a':[1, 1, 2, 2, 2]})
value_counts = df['a'].value_counts(dropna=True, sort=True)

# solution here
df_val_counts = pd.DataFrame(value_counts)
df_value_counts = df_value_counts.reset_index()
df_value_counts.columns = ['unique_values', 'counts'] # change column names
0
Wei Yuang Hsu