[英]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
由於數據幀中的前三行包含A
或B
或C
因此按預期返回 3 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.