Python Pandas: преобразовать вывод.value_counts в dataframe

Привет, я хочу получить подсчет уникальных значений фрейма данных. count_values реализует это, но я хочу использовать его выход где-то в другом месте. Как я могу преобразовать вывод.count_values в кадр данных pandas. вот пример кода:

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))

выход:

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

Что мне нужно, так это dataframe:

unique_values  counts
2              3
1              2

Спасибо.

Ответ 1

Используйте rename_axis для имени столбца из индекса и reset_index:

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

Или, если нужен один столбец DataFrame, используйте Series.to_frame:

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

Ответ 2

Я просто столкнулся с той же проблемой, поэтому я изложил свои мысли здесь.

Предупреждение

Когда вы имеете дело со структурой данных Pandas, вы должны знать тип возвращаемого значения.

Другое решение здесь

Как и @jezrael, упомянутый ранее, Pandas предоставляет API pd.Series.to_frame.

Шаг 1

Вы также можете обернуть pd.Series в pd.DataFrame, просто выполнив

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

Затем у вас есть pd.DataFrame с именем столбца 'a', и ваш первый столбец становится индексом.

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

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

Шаг 2

Что теперь?

Если вы хотите добавить новые имена столбцов в качестве pd.DataFrame, вы можете просто сбросить индекс с помощью API reset_index().

Затем измените имя столбца списком с помощью API df.coloumns.

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

Тогда вы получили то, что вам нужно

Output:

       unique_values    counts
    0              2         3
    1              1         2

Полный ответ здесь

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

Ответ 3

Я тоже добавлю в шапку, по сути, то же самое, что и решение @wy-hsu, но в формате функции:

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