pandas value_counts应用于每一列

时间:2014-04-21 12:19:44

标签: python pandas dataframe

我有一个dataframe来自外部源(csv文件)的多列(≈30),但其中有几列没有值或总是相同。因此,我会很快看到每列的value_counts,我该怎么做?

例如

  Id, temp, name
1 34, null, mark
2 22, null, mark
3 34, null, mark

会给我一个说明

的对象
  • Id:34 - > 2,22 - > 1
  • temp:null - > 3
  • name:mark - > 3

所以我知道temp是无关紧要的,名字不是很有趣(总是一样的)

6 个答案:

答案 0 :(得分:12)

对于数据框,

df = pd.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=['id', 'temp', 'name'], index=[1, 2, 3]) 

以下代码

for c in df.columns:
    print "---- %s ---" % c
    print df[c].value_counts()

将产生以下结果:

---- id ---
34    2
22    1
dtype: int64
---- temp ---
null    3
dtype: int64
---- name ---
mark    3
dtype: int64

答案 1 :(得分:7)

您可以使用df.apply,它将使用提供的函数应用每个列,在这种情况下计算缺失值。这就是它的样子,

df.apply(lambda x: x.isnull().value_counts())

答案 2 :(得分:2)

执行此操作并返回一个很好的格式化系列的好方法是合并pandas.Series.value_countspandas.DataFrame.stack

对于DataFrame

df = pandas.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=['id', 'temp', 'name'], index=[1, 2, 3]) 

您可以执行类似

的操作
df.apply(lambda x: x.value_counts()).T.stack()

在此代码中,df.apply(lambda x: x.value_counts())value_counts应用于每个列,并将其附加到生成的DataFrame,因此最终会得到一个DataFrame列,其中包含相同的列和一列每列中每个不同值的行(以及每个列中不显示的每个值的大量null)。

之后,T会转换DataFrame(因此最终会得到DataFrame,其索引等于列,列等于可能的值),stack 1}}将DataFrame的列转换为MultiIndex的新级别,并且"删除"所有Null值,使整个事件成为Series

结果是

id    22      1
      34      2
temp  null    3
name  mark    3
dtype: float64

答案 3 :(得分:2)

代码如下

df = pd.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=["id", 'temp', 'name'], index=[1, 2, 3]) 
result2 = df.apply(pd.value_counts)
result2

将产生:

enter image description here

答案 4 :(得分:1)

这类似于@Jagie的回复,但除此之外:

  1. 为列中缺少的值输入零
  2. 将计数转换为整数
    df = pd.DataFrame(
        data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']],     
        columns=["id", 'temp', 'name'], 
        index=[1, 2, 3]
    )
    result2 = df.apply(pd.value_counts).fillna(0).astype(int)

答案 5 :(得分:0)

您可以替换:

fillna(0).astype(int)

fillna(0, downcast='infer')