Получение того, какой элемент в столбце df появляется чаще всего для каждого отдельного элемента в другом столбце df (список различных отдельных строк) - PullRequest
2 голосов
/ 05 апреля 2020

У меня есть столбец с именем 'tags' в моем pandas фрейме данных, который представляет собой список из нескольких строк.

[abc, 123, xyz]
[456, 123]
[abc, 123, xyz]

, и у меня есть еще одна технология столбцов, в которой каждая строка содержит

win
mac
win

Пожалуйста, дайте мне знать, есть ли способ узнать, какой элемент в технологии чаще всего встречается для каждого элемента в тегах. Например, «ab c» чаще всего ассоциируется с «победой» по сравнению с другими техниками. Таким образом, результат должен выглядеть следующим образом:

abc win
123 win
xyz win
456 mac

Ответы [ 3 ]

3 голосов
/ 05 апреля 2020

IIU C, вы можете explode столбец Tags и использовать crosstab с idxmax:

Ввод:

d = {'Tags':[['abc', 123, 'xyz'],[456, 123],['abc', 123, 'xyz']],
     'tech':['win','mac','win']}
df = pd.DataFrame(d)
print(df)

              Tags tech
0  [abc, 123, xyz]  win
1       [456, 123]  mac
2  [abc, 123, xyz]  win

Решение:

m = df.explode('Tags')
out = pd.crosstab(m['Tags'],m['tech']).idxmax(1)


Tags
123    win
456    mac
abc    win
xyz    win
dtype: object
2 голосов
/ 05 апреля 2020

Здравствуйте, я предлагаю следующее:


import pandas as pd
# I reproduce your example
df = pd.DataFrame({"tags": [["abc", "123", "xyz"], ["456", "123"], ["abc", "123", "xyz"]],
                   "tech": ["win", "mac", "win"]})
# I use explode to have one row per tag
df = df.explode(column="tags")
# then I set index for tags
df = df.set_index("tags").sort_index()

# And then I take the most frequent value by defining a mode function
def mode(x):
    '''
    Returns mode 
    '''
    return x.value_counts().index[0]
res = df.groupby(level=0).agg(mode)

Я получаю

     tech
tags     
123   win
456   mac
abc   win
xyz   win
0 голосов
/ 05 апреля 2020

Если вам также нужна соответствующая частота с тегами:

import pandas as pd
from collections import Counter


df = pd.DataFrame({'tech':['win', 'mac', 'win'], 
              'tags':[['abc', 123, 'xyz'], [456, 123], ['abc', 234, 'xyz']]})

df = df.groupby('tech').sum() # concatenate by tech the lists

df['freq'] = [Counter(el) for el in df['tags']] # convert each list to a dict of frequency

final_df = pd.DataFrame()

# explode the column of dicts
for row in df.iterrows():
    tech = row[0]      # get the value in the metric column
    for key, value in row[1][1].items():
        tmp_df = pd.DataFrame({
            'tech':tech,
            'tag': key,
            'frequency': value
        }, index=[0])

        final_df = final_df.append(tmp_df) # append the tmp_df to our final df

final_df = final_df.reset_index(drop=True)  
...