Countif pandas python для нескольких столбцов с подстановочным знаком - PullRequest
1 голос
/ 07 мая 2020

У меня есть набор данных в Excel, который я хотел бы воспроизвести.

enter image description here

Мой python код выглядит так:

data_frames = [df_mainstore, df_store_A, df_store_B]
df_merged = reduce(lambda  left,right: pd.merge(left,right,on=["Id_number"], how='outer'), data_frames)
print(df_merged)

Поскольку я объединяю несколько фреймов данных (может отличаться по номеру столбца и имени), было бы утомительно записывать все столбцы, как в этом примере :

isY = lambda x:int(x=='Y')
countEmail= lambda row: isY(row['Store Contact A']) + isY(row['Store B Contact'])
df['Contact Email'] = df.apply(countEmail,axis=1)

Я также борюсь с выражением: isY = lambda x:int(x=='@')

Как я могу добавить столбец «Контакт имеет адрес электронной почты» так же, как и в Excel?

Ответы [ 2 ]

1 голос
/ 07 мая 2020

вы можете использовать filter для выбора столбцов с контактом в нем, затем используйте str.contains с правильным шаблоном для адреса электронной почты и, наконец, вы хотите any для каждой строки, поэтому:

#data sample
df_merged = pd.DataFrame({'id': [0,1,2,3], 
                          'Store A': list('abcd'),
                          'Store Contact A':['aa@bb.cc', '', 'e', 'f'], 
                          'Store B': list('ghij'),
                          'Store B Contact':['kk@ll.m', '', 'nn@ooo.pp', '']})

# define the pattern as in the link
pat = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
# create the column as wanted
df_merged['Contact has Email'] = df_merged.filter(like='Contact')\
                                          .apply(lambda x: x.str.contains(pat))\
                                          .any(1)

print (df_merged)
   id Store A Store Contact A Store B Store B Contact  Contact has Email
0   0       a        aa@bb.cc       g         kk@ll.m               True
1   1       b                       h                              False
2   2       c               e       i       nn@ooo.pp               True
3   3       d               f       j                              False
0 голосов
/ 07 мая 2020

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

df_merged['Contact has Email'] = df_merged['Store Contact A'].str.contains('@', na=False)|df_merged['Store B Contact'].str.contains('@', na=False)

...