列中列表中的值计数

Count of values from list in column

我有专栏

df['COL_1']

和一个数字列表

num_range = list(range(200,281, 5))

这些列包含诸如 UNREADABLE NOT_PASSIVE 之类的词或上面列表中存在的某些值,因此 200 205 210 等或什么都没有.

我正在尝试计算该列中有多少行包含给定范围内的数字的总和。

我尝试过的:

df['COL_1'].value_counts(num_range)

我不确定还能尝试什么,我做过的各种类似上述的尝试都失败了。 我是 python 的新手,非常感谢任何指导。

Python 2.7 和 pandas 0.24.2

编辑:

正如其他用户所提到的,我遇到了错误,我的数据不是数字。使用 .astype 修复此问题,或者重新定义 target_range 为:

target_range = map(str, range(200, 281, 5))

IIUC,你可以试试:

df = pd.DataFrame({'COL_1': ['UNREADABLE', 200, 'NOT_PASSIVE', 205, 210, 
                             200, '', 210, 180, 170, '']})

out = df.loc[df['COL_1'].apply(pd.to_numeric, errors='coerce')
                        .isin(num_range), 'COL_1'] \
        .value_counts()
>>> out
200    2
210    2
205    1
Name: COL_1, dtype: int64

>>> out.sum()
5

如果您追求的是总和,并且对个别计数的突破不感兴趣,

target_range = range(200, 281, 5)
df["COL_1"].isin(target_range).sum()

请注意,您不需要将 range 对象转换为 list

如果您想要突破价值计数,请参阅@Corralien 的回答。

详细信息:pandas.DataFrame.isin() 是一个 returns 布尔掩码的函数。

>>> import pandas as pd
>>> # Data provided by Corralien
>>> df = pd.DataFrame({'COL_1': ['UNREADABLE', 200, 'NOT_PASSIVE', 205, 210, 200, '', 210, 180, 170, '']})
>>> target_range = range(200, 281, 5)
>>> df.isin(target_range)
    COL_1
0   False
1    True
2   False
3    True
4    True
5    True
6   False
7    True
8   False
9   False
10  False

注意我使用的是 df.isin() 而不是 df["COL_1"].isin()。如果您的 DataFrame 中有多个要对其执行此操作的列,则可以传递 list 列名。如果要对整个 DataFrame 执行此操作,只需使用 df.isin().

.isin() 方法 returns 布尔掩码。由于 boolint 的子类型,您可以简单地在生成的 DataFrame 上调用 sum() 来总结所有 1 和 0 以获得符合您的标准的所有行的最终计数.

您在 DataFrame 中有一列作为项目列表,还有另一个值列表。并且您想计算列表中存在的数据框列中的项目数。对吗?

所以使用这个:

count = 0
for i in df['COL_1']:
    if i in num_range:
        count +=1

在您的列的每次迭代中,如果值存在于列表中,计数变量加一。