Python Pandas 计算特定值出现的次数

121

我正在尝试查找一列中某个值出现的次数。我使用以下代码创建了dataframe: data = pd.DataFrame.from_csv('data/DataSet2.csv'),现在我想要找到一列中某个值出现的次数。应该怎么做?

我认为应该像下面这样,在教育列中查找并计算?出现的次数。

下面的代码显示我正在尝试找到9th出现的次数,错误是当我运行代码时得到的:

代码

missing2 = df.education.value_counts()['9th']
print(missing2)

错误

KeyError: '9th'

2
df.education.value_counts()['?'] 应该是正确的。但它给你的是什么?(展示一些代码和实际输出) - joris
更新了问题 - JJSmith
3
也许你需要使用 print df[df.education == '9th'].count() - jezrael
2
可以概括为(df['Column'].values == 'a').sum() - Wizhi
8个回答

162

您可以根据条件创建数据的子集,然后使用shapelen

print df
  col1 education
0    a       9th
1    b       9th
2    c       8th

print df.education == '9th'
0     True
1     True
2    False
Name: education, dtype: bool

print df[df.education == '9th']
  col1 education
0    a       9th
1    b       9th

print df[df.education == '9th'].shape[0]
2
print len(df[df['education'] == '9th'])
2

性能很重要,最快的解决方案是比较numpy数组和sum

graph

代码:

import perfplot, string
np.random.seed(123)


def shape(df):
    return df[df.education == 'a'].shape[0]

def len_df(df):
    return len(df[df['education'] == 'a'])

def query_count(df):
    return df.query('education == "a"').education.count()

def sum_mask(df):
    return (df.education == 'a').sum()

def sum_mask_numpy(df):
    return (df.education.values == 'a').sum()

def make_df(n):
    L = list(string.ascii_letters)
    df = pd.DataFrame(np.random.choice(L, size=n), columns=['education'])
    return df

perfplot.show(
    setup=make_df,
    kernels=[shape, len_df, query_count, sum_mask, sum_mask_numpy],
    n_range=[2**k for k in range(2, 25)],
    logx=True,
    logy=True,
    equality_check=False, 
    xlabel='len(df)')

37

有几种方法可以使用countsum函数。

In [338]: df
Out[338]:
  col1 education
0    a       9th
1    b       9th
2    c       8th

In [335]: df.loc[df.education == '9th', 'education'].count()
Out[335]: 2

In [336]: (df.education == '9th').sum()
Out[336]: 2

In [337]: df.query('education == "9th"').education.count()
Out[337]: 2

26

一种优雅的方法来计算在任何列中出现 '?' 或任何符号的次数,是使用dataframe对象的内置函数isin

假设我们已经将'Automobile' 数据集加载到了df对象中。 我们不知道哪些列包含缺失值('?'符号),所以让我们这样做:

df.isin(['?']).sum(axis=0)

DataFrame.isin(values)官方文档描述如下:

返回一个布尔值的DataFrame,用于显示DataFrame中的每个元素是否包含在values中。

请注意,isin接受一个可迭代对象作为输入,因此我们需要将目标符号放入列表中传递给此函数。 df.isin(['?']) 将返回以下布尔值数据帧。

    symboling   normalized-losses   make    fuel-type   aspiration-ratio ...
0   False       True                False   False       False
1   False       True                False   False       False
2   False       True                False   False       False
3   False       False               False   False       False
4   False       False               False   False       False
5   False       True                False   False       False
...
为了计算每一列中目标符号的出现次数,让我们对上述数据框的所有行进行总和,指定 axis=0。 最终(截断)结果显示了我们所期望的:
symboling             0
normalized-losses    41
...
bore                  4
stroke                4
compression-ratio     0
horsepower            2
peak-rpm              2
city-mpg              0
highway-mpg           0
price                 4

16

试试这个:

(df[education]=='9th').sum()

5
可以通过将代码放在一个代码块中(缩进4个空格),并解释代码的作用来改进这个内容。 - Jerod Johnson
这将返回一个 pd.Series,其中布尔值为 True,当列 df['education'] 的条目等于 '9th' 时,否则为 Falsesum() 将计算 True 值的数量。 - ruslaniv

6

在Pandas数据框中,计算一列中出现的次数(唯一值)的简单示例:

import pandas as pd

# URL to .csv file 
data_url = 'https://yoursite.com/Arrests.csv'
# Reading the data 
df = pd.read_csv(data_url, index_col=0)
# pandas count distinct values in column 
df['education'].value_counts()

输出:

Education        47516 
9th              41164 
8th              25510 
7th              25198 
6th              25047                       
...  
3rd                 2 
2nd                 2 
1st                 2 
Name: name, Length: 190, dtype: int64

6

简单但效率低下:

list(df.education).count('9th')

4

如果要查找某列的特定值,您可以使用以下代码:

不论您的偏好如何,您都可以使用任何您喜欢的方法。

df.col_name.value_counts().Value_you_are_looking_for

以铁达尼号数据集为例

df.Sex.value_counts().male

这将计算船上所有男性的数量。但是,如果您想计算数值数据,则不能使用上述方法,因为value_counts()仅用于系列类型的数据,因此失败。

因此,您可以使用第二种方法示例来替代。第二种方法是:

#this is an example method of counting on a data frame
df[(df['Survived']==1)&(df['Sex']=='male')].counts()

虽然不如使用value_counts()高效,但这个方法可以帮助您计算数据框中的值计数。 希望这能有所帮助。

编辑--如果你想在中间有空格的地方查找某些内容

你可以使用

df.country.count('united states')我相信这应该可以解决问题。


如果我们想要查找具有空格的条目的计数,例如:美利坚合众国。我尝试用下划线替换空格,但它没有起作用。 - Jayakrishnan
第一种方法不起作用,但第二种方法会。 - shyam_gupta
df[df['country']=='美国'].计数() - shyam_gupta

0

我认为这可能是一个更简单的解决方案。假设您有以下数据框。

DATE        LANG        POSTS
2008-07-01  c#          3
2008-08-01  assembly    8
2008-08-01  javascript  2
2008-08-01  c           85
2008-08-01  python      11
2008-07-01  c#          3
2008-08-01  assembly    8
2008-08-01  javascript  62
2008-08-01  c           85
2008-08-01  python      14

你可以像这样找到LANG项目的总和

df.groupby('LANG').sum()

然后你将得到每种编程语言的总和


请格式化这个答案。 - nigel239

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接