根据pandas中列的计数条件将值分配给行的子集

时间:2016-09-09 04:48:05

标签: pandas

我有一个数据帧列,我需要匹配提供给我的子串列表。但是我只需要选择那些在我的数据帧中至少出现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个问题,因此有两个不同的问题。

1 个答案:

答案 0 :(得分:2)

我使用applynumpy.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