Существует ли функция pandas для подсчета элементов, встречающихся после определенных слов?

#python #pandas

#python #pandas

Вопрос:

 df
['ch*', 'co*', 'DePe*', 'DePe*', 'DePe*', 'pm*', 'tpm*', 'lep*']
['ch*', 'co*', 'DePe*', 'DePe*', 'DePe*', 'am*', 'te*', 'qe*','te*']
['ch*', 'co*', 'DePe*', 'ch*', 'DePe*', 'DePe*', 'tpm*', 'lep*']
['ch*', 'DePe*', 'eeae*', 'ps*', 'er*']
Name: df, Length: 4, dtype: object
  

мне нужно подсчитать элементы, возникающие после последнего экземпляра ‘DePe *’ (слева направо)
я ищу такой результат.

 df                                                                    count
['ch*', 'co*', 'DePe*', 'DePe*', 'DePe*', 'pm*', 'tpm*', 'lep*']      3
['ch*', 'co*', 'DePe*', 'DePe*', 'DePe*', 'am*', 'te*', 'qe*','te*']  4
['ch*', 'co*', 'DePe*', 'ch*', 'DePe*', 'DePe*', 'tpm*', 'lep*']      2
['ch*', 'DePe*', 'eeae*', 'ps*', 'er*']                               3
  

Комментарии:

1. Что вы пробовали до сих пор?

Ответ №1:

Используйте apply с лямбда-функцией и index наоборот lists , это работает хорошо, потому что списки индексируются на основе 0 в python:

 df['count'] = df['A'].apply(lambda x: x[::-1].index('DePe*'))
print (df)

                                                   A  count
0   [ch*, co*, DePe*, DePe*, DePe*, pm*, tpm*, lep*]      3
1  [ch*, co*, DePe*, DePe*, DePe*, am*, te*, qe*,...      4
2   [ch*, co*, DePe*, ch*, DePe*, DePe*, tpm*, lep*]      2
3                      [ch*, DePe*, eeae*, ps*, er*]      3
  

Если возможно, возможно, что какое-то значение не существует, укажите значение в try-except инструкции:

 def f(x):
    try:
        return x[::-1].index('DePe*')
    except ValueError:
        return np.nan #or return 0

df['count'] = df['A'].apply(f)
  

Ответ №2:

Использование list.index с reversed :

 my_df['count'] = [list(reversed(l)).index('DePe*') for l in my_df['df']]

                                                  df  count
0   [ch*, co*, DePe*, DePe*, DePe*, pm*, tpm*, lep*]      3
1  [ch*, co*, DePe*, DePe*, DePe*, am*, te*, qe*,...      4
2   [ch*, co*, DePe*, ch*, DePe*, DePe*, tpm*, lep*]      2
3                      [ch*, DePe*, eeae*, ps*, er*]      3
  

Ответ №3:

Я новичок в python, поэтому это решение может быть не тем, что вы ищете. Но я думаю, что это работает:

 l1 = ['ch*', 'co*', 'DePe*', 'DePe*', 'DePe*', 'pm*', 'tpm*', 'lep*']
count=0
for x in l1:
    if x == 'DePe*':
        count=0
    else:
        count =1
print (count)
  

Комментарии:

1. Неважно, просто увидел, что были опубликованы другие ответы.