Как искать и получать количество специальных символов для каждого уникального предмета в pandas - PullRequest
0 голосов
/ 19 января 2020

Используя pandas dataframe, я пытаюсь получить количество специальных символов в столбце, используя, но не получая желаемый вывод.

Мой файл .tsv: входной файл

NAME        ID
S. gambu    NNNTYR
S. gambu    RTD:78689
S. gambu    GTT:67878
S. gambu    RTD?78689
G. homos    SFDG\SS234R
G. homos    SFHG#SR234R
G. homos    JHFG:EE345T
G. homos    TYU=TT678R
T. mosus    RTU,YY67ET
T. mosus    TTR%YY67ET
G. ytrty    NaN

Я пытаюсь получить количество для каждого специального символа (: \, #% =?) Формы 'ID' без 'ИМЯ' (для каждого имени) (имя = 4 и специальные символы = 7), Я не получаю желаемый вывод для каждого имени и специальных символов, присутствующих в идентификаторах, которые являются "(: \, #% =?)"

Мне нужно рассчитывать для каждого специального символа для каждого имени. я пытался, но не получил желаемый вывод.

Желаемый вывод:

NAME         :        \          #       ?         %           =          ,

S. gambu  RTD:78689    0         0    RTD?78689    0          0          0        
           GTT:67878                      
           count(2)                    count(1)                                



G. homos     0   SFDG\SS234R  SFHG#SR234R    0       0       TYU=TT678R     0
                  count(1)     count(1)                       count(1)

T. mosus     0       0          0         0    TTR%YY67ET      0    RTU,YY67ET          
                                             count(1)                 count(1)

G. ytrty     NaN    NaN         NaN     NaN      NaN           NaN      NaN  


Total         2      1           1       1          1            1            1

желаемый вывод

~ ~ ~ python
код, который я пробовал:

pattern1 = [':','#',',','%',]
count= 0
count1 = 0
with open('name.txt') as f:
lines = f.read().splitlines()


for pat in pattern1:
    pattern1 = re.compile(pat)
     for line in lines:
        for i in range(len(df3)):
                if ((df3.loc[i,'NAME'] == line)):
                    if (pattern1.search(df3.loc[i,'ID'])):
                        count = count+1
                    out =str(df3.loc[i,'NAME'])+"\t"+str(df3.loc[i,'ID'])+"\n"
                    print(out)

~ ~ ~

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

Ответы [ 2 ]

1 голос
/ 20 января 2020

IIU C это должно сработать (df - ваш фрейм входных данных)

import re
special_chars=r"(:/,#%=@)"

#to take care of nan-s
df=df.fillna("")

for el in special_chars:
    temp_df=df["ID"].str.count(re.escape(el))
    df[el]=np.where(temp_df.gt(0), df["ID"] + " (" + temp_df.astype(int).astype(str) + ")", None)

df2=df.groupby("NAME")[list(special_chars)].agg(lambda x: list(x[~x.isna()]))

Я не совсем уверен, какой у вас желаемый формат вывода значений - поэтому я вставил его в список ...

0 голосов
/ 19 января 2020

IIU C,

мы можем использовать .str.count

Обратите внимание, что я добавил 3 специальных символа в T. mosus.

data = d="""NAME        ID
S. gambu    NNNTYR
S. gambu    RTD:78689
S. gambu    RTD:78689
S. gambu    RTD:78689
G. homos    SFDG/SS234R
G. homos    SFHG#SR234R
G. homos    JHFG:EE345T
G. homos    TYU=TT678R
T. mosus    RTU@:/YY67ET
G. ytrty    NaN"""

df = pd.read_csv(StringIO(data),sep='\s+')
pat = '[(:/,#%\=@)]'
df['count'] = df['ID'].str.count(pat)

print(df)
     NAME            ID  count
S.  gambu        NNNTYR    0.0
S.  gambu     RTD:78689    1.0
S.  gambu     RTD:78689    1.0
S.  gambu     RTD:78689    1.0
G.  homos   SFDG/SS234R    1.0
G.  homos   SFHG#SR234R    1.0
G.  homos   JHFG:EE345T    1.0
G.  homos    TYU=TT678R    1.0
T.  mosus  RTU@:/YY67ET    3.0
G.  ytrty           NaN    NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...