这与我之前提出的一个问题有关,我正在发布这个新的问题,因为我认为它足够unique并且一直很困难。我有一个格式的数据框:
keyword string match
A "Varied String..." ['string','string','test','string']
"Varied String..." ['string','string']
"Varied String..." ['test']
B "Varied String..." ['string,'string','test']
是通过以下代码(由@ anky_91编写)创建的:
df1.groupby(df2.Type.ffill()).matches.apply(lambda x: ''.join(mode(list(chain.from_iterable(x)))[0]))
这是我的问题,这将创建一个完全正常的新列匹配,但是,尽管我确实需要模式,但我只想要最频繁的唯一值。因此,我没有尝试将match
列填充为列表模式,而是尝试使其成为该模式的最常用值,所以:
keyword string match
A "Varied String..." 'string'
B "Varied String..." 'string'
我尝试这样做:
df = freq_df['matches'].agg(lambda x: x.value_counts().index[0])
返回哪个,不变。然后,我尝试
df['matches'].value_counts()
哪个返回的计数不正确,所以我不确定这是怎么回事。
让我知道是否清楚!
答案 0 :(得分:1)
您可以使用Series.str.extractall()将每个匹配的单词检索到自己的行中,而不必使用 Series.str.findall()将匹配项检索到列表中,这可以简化您的任务(下面使用上一篇文章中的示例数据,并删除了 string 列中的双引号)。
# list of keywords
keyword_list=['string', 'test']
# regex pettern to retrieve only words matched from keywork_list
ptn = r'\b(' + '|'.join(keyword_list) + r')\b'
# get the list of matched words (assume `keyword` is already on index), if not, use the following
# s = df.set_index('keyword').string.str.extractall(ptn).reset_index(level=1, drop=True)[0]
s = df.string.str.extractall(ptn).reset_index(level=1, drop=True)[0]
print(s)
#keyword
#A test
#A string
#A test
#A string
#A string
#A string
#A test
#A string
#B test
#B string
#B test
#B string
#B test
#Name: 0, dtype: object
接下来,您可以通过value_counts()检索每个关键字的首页
s.groupby('keyword').apply(lambda x: x.value_counts().nlargest(1))
#keyword
#A string 5
#B test 3
#Name: 0, dtype: int64
或仅关键字和字符串不计:
s.groupby('keyword').apply(lambda x: x.value_counts().idxmax())
#keyword
#A string
#B test
#Name: 0, dtype: object