Python Pandas:转换" .value_counts"输出到数据帧

时间:2017-11-06 11:53:34

标签: python pandas 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'>

我需要的是这样的数据框:

unique_values  counts
2              3
1              2

谢谢。

5 个答案:

答案 0 :(得分:24)

使用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

答案 1 :(得分:1)

我只是遇到了同样的问题,所以我在这里提供我的想法。

警告

在处理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,则只需通过reset_index()的API重置索引即可。

然后,使用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

答案 2 :(得分:0)

我也会戴上帽子,基本上与@ 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

答案 3 :(得分:0)

pd.DataFrame(
    df.groupby(['groupby_col'])['column_to_perform_value_count'].value_counts()
).rename(
    columns={'old_column_name': 'new_column_name'}
).reset_index()

答案 4 :(得分:0)

从数据框中选择列子集、分组、每组应用 value_count、将 value_count 列命名为 Count 并显示前 n 个组的示例。

# Select 5 columns (A..E) from a dataframe (data_df).
# Sort on A,B. groupby B. Display first 3 groups.
df = data_df[['A','B','C','D','E']].sort_values(['A','B'])
g = df.groupby(['B'])
for n,(k,gg) in enumerate(list(g)[:3]): # display first 3 groups
    display(k,gg.value_counts().to_frame('Count').reset_index())