繁体   English   中英

Python:计算包含列范围内文本的行数

[英]Python: Count number of rows containing text within range of columns

当行包含某些文本时计算行数中的答案让我有点...

列标记为“1a.”、“2a.”和“3a.”。 每行都标有唯一标识符(随机字母数字代码)。

桌子

您如何计算多列中至少包含 10 个字母中的 1 个的行数?

此代码适用于一列: len(df[df['1a.'].str.contains('A|I|M|Q|C|K|G|O|E|S')])

我尝试使用len(df[df['1a.'|'2a.'|'3a.'].str.contains('A|I|M|Q|C|K|G|O|E|S')])并得到一个错误:


TypeError Traceback(最近一次调用最后一次)在----> 1 len(df[df['1a.'|'2a.'|'3a.'].str.contains('A|I|M|Q| C|K|G|O|E|S')])

类型错误:不支持 | 的操作数类型:'str' 和 'str'

该行应该只计算一次,无论三列是否包含“A”和“I”和“M”(列表中的所有三个字母)或“A”和“B”和“L”(最后两个字母不在列表中)列表)。

您可以使用&|对 2 列进行逻辑运算。 例如:

df[df['1a.'].str.contains('A|I|M|Q|C|K|G|O|E|S')] | df[df[|'2a.'].str.contains('A|I|M|Q|C|K|G|O|E|S')] | df[df['3a.'].str.contains('A|I|M|Q|C|K|G|O|E|S')]

对数据帧的两列进行逻辑运算

所以完整的答案是:

(df[df['1a.'].str.contains('A|I|M|Q|C|K|G|O|E|S')] | df[df[|'2a.'].str.contains('A|I|M|Q|C|K|G|O|E|S')] | df[df['3a.'].str.contains('A|I|M|Q|C|K|G|O|E|S')]).value_counts()[True]

通过将您要搜索的字母放在列表search_for_items ,您可以在两行中获得您想要的内容

search_for_items = ['A','B','C']
boolean_series = df.apply(lambda x: bool(set(list(x)) & set(search_for_items)), axis=1)
num_of_rows = boolean_series.sum()

说明

1- 获取您需要在列表中搜索的项目

2- 通过查找两个集合是否至少有一个项目相交来获取布尔系列。 第一组表示数据帧行中的值。 第二组代表您正在搜索的项目。

3- 最后,只要它为真,就将 sum 函数应用于这个系列的求和。

示例

import pandas as pd

df = pd.DataFrame({ 'a1':['A','B', 'Z','D','E','F','G'],
                    'a2':['A','Q', 'C','D','E','F','G'],
                    'a3':['A','Z', 'Q','D','E','F','G']
                  })
search_for_items = ['A','B','C']
df
    a1  a2  a3
0   A   A   A
1   B   Q   Z
2   Z   C   Q
3   D   D   D
4   E   E   E
5   F   F   F
6   G   G   G

解决方案:

boolean_series = df.apply(lambda x: bool(set(list(x)) & set(search_for_items)), axis=1)
num_of_rows = boolean_series.sum()
num_of_rows
3

由于数据帧中的前三行包含ABC因此按预期返回 3 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM