列中列表中的值计数
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 布尔掩码。由于 bool
是 int
的子类型,您可以简单地在生成的 DataFrame 上调用 sum()
来总结所有 1 和 0 以获得符合您的标准的所有行的最终计数.
您在 DataFrame 中有一列作为项目列表,还有另一个值列表。并且您想计算列表中存在的数据框列中的项目数。对吗?
所以使用这个:
count = 0
for i in df['COL_1']:
if i in num_range:
count +=1
在您的列的每次迭代中,如果值存在于列表中,计数变量加一。
我有专栏
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 布尔掩码。由于 bool
是 int
的子类型,您可以简单地在生成的 DataFrame 上调用 sum()
来总结所有 1 和 0 以获得符合您的标准的所有行的最终计数.
您在 DataFrame 中有一列作为项目列表,还有另一个值列表。并且您想计算列表中存在的数据框列中的项目数。对吗?
所以使用这个:
count = 0
for i in df['COL_1']:
if i in num_range:
count +=1
在您的列的每次迭代中,如果值存在于列表中,计数变量加一。