将CELL中最常见的元素追加到列pandas

时间:2019-05-28 19:44:01

标签: python pandas

这与我之前提出的一个问题有关,我正在发布这个新的问题,因为我认为它足够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()

哪个返回的计数不正确,所以我不确定这是怎么回事。

让我知道是否清楚!

1 个答案:

答案 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