我有一个数据帧列,我需要匹配提供给我的子串列表。但是我只需要选择那些在我的数据帧中至少出现3次的子串。一旦我得到那些子串,我需要做的就是找到那些包含子串的行并分配一些与匹配模式相对应的值。
这就是我目前所做的事情。
#dataframe has 9000 rows
reg_ = {'a':0.03,'b':0.05 ... 'ak':0.004} #approx 2000 patterns
for reg_pat in reg_:
count = 0
eliter = len(training[training['concat'].str.contains(reg_pat)]['concat'])
if (eliter >= 3):
training[reg_pat] = 0
training.loc[training['concat'].str.contains(reg_pat), reg_pat] = reg_[reg_pat]
muCOls += 1
有什么方法我可以将过滤器和assignemnt作为单个表达式。
请注意,我已经提出了一个与子问题相同的问题。在那里,我只要求找到计数。在这里,我很想知道是否可以组合两个操作,即查找计数然后使用它来分配值。
Finding the count of a set of substrings in pandas dataframe
dataframe列如下所示
training['concat']
0 svAxu$paxArWAn
1 xvAxaSa$varRANi
2 AxAna$xurbale
3 go$BakwAH
4 viXi$Bexena
5 nIwi$kuSalaM
6 lafkA$upamam
7 yaSas$lipsoH
8 kaSa$AGAwam
9 hewumaw$uwwaram
10 varRa$pUgAn
请告诉我如果我需要删除此问题,只需修改旧问题。我认为这些是2个问题,因此有两个不同的问题。
答案 0 :(得分:2)
我使用apply
和numpy.where
:
reg_ = {'anuBavAn':0.35, 'a$piwra':0.2, 'piwra':0.7, 'pa':0.03, 'a':0.0005}
elites = dict()
for reg_pat in reg_:
mask_eliter = training['concat'].apply(lambda x: reg_pat in x)
if mask_eliter.sum() >= 3:
Val = reg_[reg_pat]
training[reg_pat] = np.where(mask_eliter,Val, 0)
elites[reg_pat] = Val
print (training)
concat a
0 svAxu$paxArWAn 0.0005
1 xvAxaSa$varRANi 0.0005
2 AxAna$xurbale 0.0005
3 go$BakwAH 0.0005
4 viXi$Bexena 0.0005
5 nIwi$kuSalaM 0.0005
6 lafkA$upamam 0.0005
7 yaSas$lipsoH 0.0005
8 kaSa$AGAwam 0.0005
9 hewumaw$uwwaram 0.0005
10 varRa$pUgAn 0.0005
concat
的另一个解决方案:
reg_ = {'anuBavAn':0.35, 'a$piwra':0.2, 'piwra':0.7, 'pa':0.03, 'a':0.0005}
elites = dict()
#first add column 'concat'
df_val = [training['concat']]
for reg_pat in reg_:
mask_eliter = training['concat'].apply(lambda x: reg_pat in x)
if mask_eliter.sum() >= 3:
Val = reg_[reg_pat]
#append Series to list
df_val.append(pd.Series(np.where(mask_eliter,Val, 0), name=reg_pat))
elites[reg_pat] = Val
print (pd.concat(df_val, axis=1))
concat a
0 svAxu$paxArWAn 0.0005
1 xvAxaSa$varRANi 0.0005
2 AxAna$xurbale 0.0005
3 go$BakwAH 0.0005
4 viXi$Bexena 0.0005
5 nIwi$kuSalaM 0.0005
6 lafkA$upamam 0.0005
7 yaSas$lipooH 0.0005
8 kaSa$AGAwam 0.0005
9 hewumaw$uwwaram 0.0005
10 varRa$pUgAn 0.0005