CumSum строк фрейма данных, если значение находится в другом фрейме данных - PullRequest
4 голосов
/ 18 июня 2020

У меня в jupyter-notebook 2 фрейма данных. В первом у меня есть серия со списками слов, а во втором - серия со словами. Мне нужно перебрать каждый список слов из первого фрейма данных, чтобы проверить, находится ли слово в другом фрейме данных, и сделать кумулятивную сумму.

    a = pd.DataFrame({'text': [['one', 'two', 'three'], ['two', 'four'], ['five', 'one']], 'pos': [21,22,23], 'neg': [0,0,0]})

        text               pos   neg
    0   [one, two, three]   21    0
    1   [two, four]         22    0
    2   [five, one]         23    0

    b = pd.DataFrame({'word': ['two', 'three', 'four'], 'pos': [100,200,300], 'neg': [1,2,3]})

        word     pos    neg
    0   two      100     1   
    1   three    200     2
    2   four     300     3

Итак, я хотел бы получить это:

        text               pos   neg
    0   [one, two, three]  321    3
    1   [two, four]        422    4
    2   [five, one]         23    0

Спасибо.

Ответы [ 3 ]

3 голосов
/ 18 июня 2020

Вот одно из возможных решений с использованием Series.apply и Series.map:

def maplist(lst):
    s = pd.Series(lst)
    return pd.Series(
        {'pos': s.map(mappings['pos']).sum(), 'neg': s.map(mappings['neg']).sum()})

mappings = b.set_index('word')
a[['pos', 'neg']] += a['text'].apply(maplist)

# print(a)
                    text    pos  neg

0      [one, two, three]  321.0  3.0
1            [two, four]  422.0  4.0
2            [five, one]   23.0  0.0
1 голос
/ 18 июня 2020

Можно сделать так:

c = a.explode('text').reset_index()\
     .merge(b, how='left', left_on='text', right_on='word', suffixes=('','_y'))
c = c.groupby('index').agg({'text':list,
                            'pos':'first',
                            'pos_y':'sum',
                            'neg':'first',
                            'neg_y':'sum'})
c['pos'] = c['pos'] + c['pos_y']
c['neg'] = c['neg'] + c['neg_y']
c = c.drop(['pos_y', 'neg_y'], axis=1)
c

Вывод:

                   text    pos  neg
index                               
0      [one, two, three]  321.0  4.0
1            [two, four]  422.0  6.0
2            [five, one]   23.0  3.0
0 голосов
/ 18 июня 2020
pos_lst = [] 
neg_lst = [] 
for index, rows in a.iterrows():
    pos = rows['pos']
    neg = rows['neg']
    for lst in rows['text']:
        pos = pos + b[b['word'] == lst].pos.sum()
        neg = neg + b[b['word'] == lst].neg.sum()
    pos_lst.append(pos)
    neg_lst.append(neg)
temp = pd.DataFrame() 
temp['text'] = a['text'] 
temp['pos_lst'] = pos_lst
temp['neg_lst'] = neg_lst 
temp`
...