将单元格中最常见的元素附加到列熊猫



这与我之前问的一个问题有关,我发布这个新问题,因为我认为它足够独特且持续困难。我有一个表单的数据框:

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()

这返回了不准确的计数,所以我不确定这是怎么回事。

让我知道这是否清楚!

您可以使用 Series.str.extractall(( 将每个匹配的单词检索到其自己的行中,而不是使用 Series.str.findall(( 将匹配项检索到列表中,这可以使您的任务更容易(下面使用上一篇文章中的示例数据并从字符串列中删除了双引号(。

# 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

最新更新