【问题标题】:Data analysis at keyword matching(List - column)关键词匹配数据分析(列表-列)
【发布时间】:2020-02-07 08:20:53
【问题描述】:

在我之前的任务中,

python Keyword matching(keyword list - column)

所以它工作。更进一步,我想看更多。

问题

第一季度。我想检查匹配列表中单词的频率。

输出我想要的 Q1*

DF

0   K   Ieatapple
1   Y   bananaisdelicious
2   B   orangelikesomething 
3   Q   bluegrape
4   C   appleislike

mylist = [apple, banana]

#keyword matching

df[df['Value'].str.contains("|".join(mylist))]

  Name                Value
0    K          I eat apple
1    Y  banana is delicious
4    C          appleislike

#output what I want
matching word frequency : apple : 2, banana : 1

第二季度。我想检查 List 中的哪些单词与 List 匹配的行匹配?

输出我想要的 Q2

假设数据框与上例相同,

  Name                Value
0    K          I eat apple
1    Y  banana is delicious
4    C          appleislike

#Matching keyword&row
0 : apple
1 : banana
4 : apple

如果你有不止一个,我希望你把它们都展示出来。

感谢您的阅读,如果您对我的问题有任何疑问,请问我。

进一步

    Value                 New
0   I eat appleapple      apple,apple
1   banana is delicious   banana
2   appleislikeapple      apple,apple

我申请了以下答案,效果很好。 但我还需要一件事。

如上例所示,如果连续出现重复单词,则全部查找。如果单词重复,我只想显示其中一个。

通过寻找另一个stackoverflow,我尝试了删除连续重复单词的方法,例如Ordereddict,但它似乎只适用于链接的句子。

喜欢apple apple apple -> apple 不适用于我的情况,例如apple, apple -> apple, apple

所以当我使用下面的代码时,

s = pd.DataFrame (extracted.tolist ()). stack (). value_counts ()

统计所有重复的单词。

我该如何解决?

【问题讨论】:

  • @jezrael 还需要一件事,我进一步添加了它。可以的话可以帮忙看看吗?

标签: python pandas dataframe match


【解决方案1】:

如果只想匹配一个,首先匹配的值使用Series.str.extract,并在列表中加入值:

df['new'] = df['Value'].str.extract(f'({"|".join(mylist)})', expand=False)
print (df)
  Name                Value     new
0    K          I eat apple   apple
1    Y  banana is delicious  banana
4    C          appleislike   apple

计数使用Series.value_counts:

s = df['new'].value_counts()
print (s)
apple     2
banana    1
Name: new, dtype: int64

print ('matching word frequency: ' + ', '.join(f'{k}:{v}' for k, v in s.items()))
matching word frequency: apple:2, banana:1

如果要匹配所有值,请使用 Series.str.findallSeries.str.join

extracted = df['Value'].str.findall(f'({"|".join(mylist)})')
df['new'] = extracted.str.join(',')
print (df)
  Name                   Value           new
0    K  I eat apple and banana  apple,banana
1    Y     banana is delicious        banana
4    C             appleislike         apple

对于计数使用 DataFrame cosntructor 和 DataFrame.stackvalue_counts

s = pd.DataFrame(extracted.tolist()).stack().value_counts()
print (s)
apple     2
banana    2
dtype: int64

print ('matching word frequency: ' + ', '.join(f'{k}:{v}' for k, v in s.items()))
matching word frequency: apple:2, banana:2

【讨论】:

  • 好奇心:如果每行有多个匹配项,这仍然有效,例如第一行是"I eat apple and banana"?
  • @Arnaud - 感谢您的通知,您的输入的答案也已更改。
  • @jezrael 语法中的 k 和 v 是否只是为迭代指定的?
  • @ybin - 不,它是字典理解,大部分时间使用kv 作为键和值的快捷方式
  • @ybin - 好的,或者如果可能,将其发送到我的电子邮件
猜你喜欢
  • 2020-05-18
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
相关资源
最近更新 更多