【问题标题】:Python: Count number of rows containing text within range of columnsPython:计算包含列范围内文本的行数
【发布时间】:2020-02-01 09:16:53
【问题描述】:

Count number of rows when row contains certain text 中的答案让我半途而废……

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

Table

如何计算多列中至少包含 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')])

TypeError: |: 'str' 和 'str' 的操作数类型不受支持

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

【问题讨论】:

  • "1a|2a" 和"1a"|"2a" 有很大的区别

标签: python pandas count row


【解决方案1】:

通过将您要搜索的字母放入列表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 函数为真,就将 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

它按预期返回 3,因为数据框中的前三行包含 A 或 B 或 C。

【讨论】:

  • 谢谢!我进行了修改以限制列:df = pd.DataFrame({ '1a':df['1a.'], '2a':df['2a.'], '3a':df['3a.'] }) search_for_items = ['A','I','M','Q','C','K','G','O','E','S'] 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
【解决方案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')]

Logical operation on two columns of a dataframe

所以完整的答案是:

(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]

【讨论】:

    猜你喜欢
    • 2013-04-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多