簡體   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