Подсчет по столбцам данных на основе str.contains (или аналогичных) - PullRequest
2 голосов
/ 29 мая 2019

Я хотел бы посчитать количество ячеек в каждой строке, которые содержат определенную строку символов, ячейки, которые имеют определенную строку более одного раза, должны учитываться только один раз.

Я могу посчитать количество ячеек в строке, равное заданному значению, но когда я расширяю эту логику для использования 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)

Выходные данные должны быть сериями, показывающими количество ячеек в каждой строке, которые содержат данную строку символов.

Ответы [ 3 ]

2 голосов
/ 29 мая 2019

str.contains - последовательный метод. Чтобы применить его ко всему фрейму данных, вам нужно либо agg, либо apply, например:

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

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

Если вам не нравятся agg или apply, вы можете использовать np.char.find для непосредственной работы с базовым массивом numpy df

(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
1 голос
/ 29 мая 2019

Решение с использованием 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
1 голос
/ 29 мая 2019

Примерно так должно работать:

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

Следует обобщить столько столбцов, сколько вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...