簡體   English   中英

根據str.contains(或類似內容)對數據框列進行計數

[英]Count across dataframe columns based on str.contains (or similar)

我想計算包含特定字符串的每一行中的單元格數量,具有特定字符串不止一次的單元格應該僅計算一次。

我可以計算一行中等於給定值的單元格的數量,但是當我將此邏輯擴展為使用str.contains時,出現了如下問題:


d = {'col1': ["a#", "b","c#"], 'col2': ["a", "b","c#"]}
df = pd.DataFrame(d)

#can correctly count across rows using equality 
thisworks =( df =="a#" ).sum(axis=1)

#can count across  a column using str.contains
thisworks1=df['col1'].str.contains('#').sum()

#but cannot use str.contains with a dataframe so what is the alternative
thisdoesnt =( df.str.contains('#') ).sum(axis=1)

輸出應該是一個序列,顯示每行包含給定字符串的單元格的數量。

str.contains是一種串聯方法。 要將其應用於整個數據框,您需要進行aggapply例如:

df.agg(lambda x: x.str.contains('#')).sum(1)

Out[2358]:
0    1
1    0
2    2
dtype: int64

如果您不喜歡agg也不apply ,則可以使用np.char.find直接在df底層numpy數組上工作

(np.char.find(df.values.tolist(), '#') + 1).astype(bool).sum(1)

Out[2360]: array([1, 0, 2])

將其傳遞給df系列或列

pd.Series((np.char.find(df.values.tolist(), '#') + 1).astype(bool).sum(1), index=df.index)

Out[2361]:
0    1
1    0
2    2
dtype: int32

這樣的事情應該起作用:

df = pd.DataFrame({'col1': ['#', '0'], 'col2': ['#', '#']})
df['totals'] = df['col1'].str.contains('#', regex=False).astype(int) +\
               df['col2'].str.contains('#', regex=False).astype(int)
df
#   col1 col2  totals
# 0    #    #       2
# 1    0    #       1

它應該歸納為任意數量的列。

使用df.apply的解決方案:

df = pd.DataFrame({'col1': ["a#", "b","c#"], 
                   'col2': ["a", "b","c#"]})
df
  col1 col2
0   a#    a
1    b    b
2   c#   c#

df['sum'] = df.apply(lambda x: x.str.contains('#'), axis=1).sum(axis=1)

  col1 col2  sum
0   a#    a    1
1    b    b    0
2   c#   c#    2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM