Как проверить фрейм данных, состоящий из списка строк, с фреймом данных поиска и выполнить вычисления? - PullRequest
0 голосов
/ 27 июня 2018

У меня есть фрейм данных df1, который содержит строки токенизированных строк:

df1 = pd.DataFrame(data = {'tokens' : [['auditioned', 'lead', 'role', 'play', 
'play'], ['kittens', 'adopted', 'family'], ['peanut', 'butter', 'jelly', 
'sandwiches', 'favorite'], ['committee', 'decorated', 'gym'], ['surprise', 
'party', 'best', 'friends']]})

У меня также есть фрейм данных df2, который содержит строки из одного слова, а также оценку, относящуюся к каждому слову:

df2 = pd.DataFrame(data = {'word' : ['adopted', 'auditioned',
'favorite', 'gym', 'play', 'sandwiches'], 'score' : [1, 2, 3, 4, 5,
6]})

Каков наилучший способ использования df2 в качестве своего рода «таблицы поиска», которую я также могу использовать для выполнения вычислений?

Для каждой строки в df1 мне нужно проверить, существуют ли какие-либо слова в df2. Если это так, подсчитайте количество найденных слов и сохраните результат в серии под названием word_count (если определенное слово встречается в df1 более одного раза, считайте каждое вхождение). Кроме того, когда слово в df1 существует в df2, суммируйте оценку этого слова с любыми другими словами, найденными в серии под названием total score. Окончательный результат должен выглядеть как df3:

df3 = pd.DataFrame(data = {'tokens' : [['auditioned', 'lead', 'role', 'play', 'play'], ['kittens', 'adopted', 'family'], ['peanut', 'butter', 'jelly', 'sandwiches', 'favorite'], ['committee', 'decorated', 'gym'], ['surprise', 'party', 'best', 'friends']], 'word_count' : [3, 1, 2, 1, 0], 'total_score' : [12, 1, 9, 4, None]})

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Использование:

d = df2.set_index('word')['score']

def f(x):
    y = [d.get(a) for a in x if a in d]
    return pd.Series([len(y), sum(y)], index=['word_count','total_score'])

df3[['word_count','total_score']] = df3['tokens'].apply(f)
print (df3)
                                          tokens  word_count  total_score
0           [auditioned, lead, role, play, play]           3           12
1                     [kittens, adopted, family]           1            1
2  [peanut, butter, jelly, sandwiches, favorite]           2            9
3                    [committee, decorated, gym]           1            4
4               [surprise, party, best, friends]           0            0
0 голосов
/ 27 июня 2018

Подход 1

создать базовый словарь, который будет использоваться для отображения в приложении

m0 = dict(df2.values)
m1 = lambda x: m0.get(x, 0)
m2 = lambda x: int(x in m0)
df1.assign(
    word_count=df1.tokens.apply(lambda x: sum(map(m2, x))),
    Total=df1.tokens.apply(lambda x: sum(map(m1, x)))
)

                                          tokens  word_count  Total
0           [auditioned, lead, role, play, play]           3     12
1                     [kittens, adopted, family]           1      1
2  [peanut, butter, jelly, sandwiches, favorite]           2      9
3                    [committee, decorated, gym]           1      4
4               [surprise, party, best, friends]           0      0

Подход 2

создайте новую серию, которая раскручивает слова в df1, но поддерживает значения индекса, так что мы можем агрегировать с подсчетом и суммой.

idx = df1.index.repeat(df1.tokens.str.len())
s1 = pd.Series(np.concatenate(df1.tokens), idx)
s2 = s1.map(dict(df2.values)).groupby(level=0).agg(['count', 'sum'])
df1.join(s2.rename(columns=dict(count='word_count', sum='total_score')))

                                          tokens  word_count  total_score
0           [auditioned, lead, role, play, play]           3         12.0
1                     [kittens, adopted, family]           1          1.0
2  [peanut, butter, jelly, sandwiches, favorite]           2          9.0
3                    [committee, decorated, gym]           1          4.0
4               [surprise, party, best, friends]           0          0.0
0 голосов
/ 27 июня 2018

Вы можете сделать

d=dict(zip(df2.word,df2.score))

helpdf=df1.tokens.apply(lambda x :pd.Series([d.get(y)for y in x ]))
df1['Total']=helpdf.sum(1)
df1['count']=helpdf.notnull().sum(1)
df1
Out[338]: 
                                          tokens  Total  count
0           [auditioned, lead, role, play, play]   12.0      3
1                     [kittens, adopted, family]    1.0      1
2  [peanut, butter, jelly, sandwiches, favorite]    9.0      2
3                    [committee, decorated, gym]    4.0      1
4               [surprise, party, best, friends]    0.0      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...