如何在Pandas中为大量列重新格式化value_counts()分析

时间:2018-03-21 10:37:41

标签: python pandas dataframe

我的数据集包含数百个列和数千行

In [119]:
df.columns
Out[119]:
Index(['column 1', 'column2',
       ...
       'column 100'],
      dtype='object', name='var_name')

通常我为每一列都value_counts()查看分布。

In [121]:
a = df['column1'].value_counts()
In [122]:
a
Out[122]:
1     77494
2      5389
0      2016
3       878
Name: column 1, dtype: int64

但是对于这个数据帧,如果我为每个列做了这个,这将使我的笔记本非常混乱,如何自动化这个?有没有帮助的功能?

如果您有其他信息,我的所有数据都是int64,但我希望最佳答案可以提供适用于所有情况的解决方案。我想在pandas数据帧中做出解决方案答案。

基于@MaxU建议,这是我的简化数据框版本

df

id  column1  column2 column3
1         3        1       7
2         3        2       8
3         2        3       7
4         2        1       8
5         1        2       7

我的预期输出是:

column 1   count
1          1
2          2
3          2
column 2   count
1          2
2          2
3          1
column 3   count
7          3
8          2
3          1

3 个答案:

答案 0 :(得分:1)

你应该使用for循环。 这里all =所有列名列表。

all = list(df)
for I in all:
   print(df[I].value_counts())

答案 1 :(得分:1)

我这样做:

In [83]: df.drop('id',1).apply(lambda c: c.value_counts().to_dict())
Out[83]:
column1    {3: 2, 2: 2, 1: 1}
column2    {2: 2, 1: 2, 3: 1}
column3          {7: 3, 8: 2}
dtype: object

或:

In [84]: for c in df.drop('id',1):
    ...:     print(df[c].value_counts())
    ...:
3    2
2    2
1    1
Name: column1, dtype: int64   # <----- column name
2    2
1    2
3    1
Name: column2, dtype: int64
7    3
8    2
Name: column3, dtype: int64

答案 2 :(得分:1)

您可以按顺序生成所需的value_counts,转换为数据框并写入csv:

import pandas as pd

with open('out.csv', 'w') as out:

    for col in df.columns[1:]:

        res = df[col].value_counts()\
                     .reset_index()\
                     .rename(columns={col: 'count', 'index': col})\

        res.to_csv(out, index=False)