计算数据框A的每一行出现在另一个数据框的许多元素的每一行中多少次

时间:2018-08-03 21:16:41

标签: python pandas count

我有一个数据框A,其中有一列,共2009行,每行中都有许多元素,例如:

                          Text
                  0       first, german, television,abide, called, ladies, dai...
                  1       party, day, hanover, cdu, first, soft, bundest...
                  2       evening,ability chancellor, merkel, berlin, israeli, ...
                  3       egypt, followers, opponent, president, must, v...
                  4       eu, commission, wants, high, youth, unemployme...
                  5       european, aviation, armament, company, eads, s...
                   ....

另一个数据框B,1900行,每行中只有一个元素

                               Word
              0                 abide
              1               ability
              2                 able
              3               abound
              4              absolve
              5            absorbent
              6           absorption
              7            abundance
             ....

我想计算数据框B的所有行中的元素出现在数据框A的每一行中的次数

      Word=B.Word
      List=Word.tolist()

      #Option 1
      A.Text.str.extractall(
'({})'.format('|'.join(str(v) for v in List))
  ).groupby(level=0) 
 [0].value_counts().unstack(fill_value=0)

  Option2
df=A.Text.str.extractall('({})'.format('|'.
join(map(str, List))))\                       
.iloc[:,0].str.get_dummies().sum(level=0)

我尝试了上述两个选项,但是结果返回一个新的数据帧,其中数据帧A的行数和数据帧B的行数减少。 因此,也许它们不是执行此任务的正确方法。 有什么建议吗?

预先感谢

1 个答案:

答案 0 :(得分:1)

我可能会将您需要的东西退回。如果您需要dfB的每一行中显示的dfA中的项目数:

dfA.Text.str.split(',\s?', expand=True).stack().isin(dfB.Word.tolist()).groupby(level=0).sum()

如果您需要dfB中某个项目出现在dfA中任何位置的次数:

dfA.Text.str.split(',\s?', expand=True).stack().value_counts().reindex(dfB.Word)

样本数据

import pandas as pd
dfA = pd.DataFrame({'Text':['first, german, television,abide, called, ladies',
                            'party, day, hanover, cdu, first, soft', 
                            'foo, bar, baz, zoo']})
dfB = pd.DataFrame({'Word': ['first', 'german', 'party', 'soft']})

代码

dfA.Text.str.split(',\s?', expand=True).stack().isin(dfB.Word.tolist()).groupby(level=0).sum()
#0    2.0
#1    3.0
#2    0.0
#dtype: float64

dfA.Text.str.split(',\s?', expand=True).stack().value_counts().reindex(dfB.Word)
#Word
#first     2
#german    1
#party     1
#soft      1
#dtype: int64