【问题标题】:Counting the total number of categorial values in a column for an entire dataframe计算整个数据框的列中分类值的总数
【发布时间】:2017-03-07 10:17:40
【问题描述】:

(我确定这是一个重复的问题——对不起,我无法弄清楚。)

我有数百个 *csv 文件,我想计算一列的分类变量。值得庆幸的是,这些文件已经被清理,因此它们具有保存格式。表格格式的示例文件:

import pandas as pd
import numpy as np
df = pd.DataFrame({"column1": ["value1", "value2", "value3", "value4", "value5", "value6", "value7"], 
                   "column2" : ["element_A", "element_A", "element_B", "element_A", "element_B", "element_B", "element_A"],
                   "column3" : ["item22", "item6", "item7", "item42", "item49", "item91", "item3"],
                   "column4" : ["abc", "edf", "edf", "abc", "edf", "xyz", "abc"]})
df = df[["column1", "column2", "column3", "column4"]]


df

输出

    column1 column2     column3 column4
0   value1  element_A   item22  abc
1   value2  element_A   item6   edf
2   value3  element_B   item7   edf
3   value4  element_A   item42  abc
4   value5  element_B   item49  edf
5   value6  element_B   item91  xyz
6   value7  element_A   item3   abc

对于每个文件,我想统计 `column4' 中的项目数,并在“主表”中为每个文件输出这些统计信息,每行一个文件名,例如

            abc    def    xyz
filename1   3      3      1
filename2   42     0      7 
filename3   0      16     4
filename4   4      71     21
....

我的方法是glob 每个文件名,然后使用groupby 计数。但是,我遇到了一个错误:

import pandas as pd
import glob

final = pd.Dataframe()
files = glob.glob("*.csv")
for filename in files:
    df = pd.read_table(filename)
    df["filename"] = str(filename)
    df = df.groupby("column4").count().unstack("column4").fillna(0).astype(int)
    final = final.append(df, ignore_index=True)

这里当然有错误:

 df = df.groupby("column4").count().unstack("column4").fillna(0).astype(int)

因为这将计算df 中每一列的值

         column4
column1  abc        3
         edf        3
         xyz        1
column2  abc        3
         edf        3
         xyz        1
column3  abc        3
         edf        3
         xyz        1
dtype: int64

我犯的 n00b 错误是什么?

【问题讨论】:

    标签: pandas dataframe count


    【解决方案1】:

    我认为你应该使用value_counts,像这样:

    final = pd.DataFrame()
    for filename in files:
        df = pd.read_table(filename)
        new_row = df['column4'].value_counts().set_value('filename', filename)
        final = final.append(new_row, ignore_index=True)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 2018-01-22
      相关资源
      最近更新 更多