Извлечение данных из фрейма данных с помощью панд - PullRequest
0 голосов
/ 20 сентября 2019

У меня следующий фрейм данных.

PredictedFeature    Document_IDs                                   did  avg
   2000.0          [160, 384, 3, 217, 324, 11, 232, 41, 377, 48]    11  0.6
 2664.0        [160, 384, 3, 217, 324, 294,13,11]                     13  0.9

ТАК, вот так у меня есть фрейм данных, в котором больше таких данных.Теперь, что я пытаюсь, у меня есть это did column, в котором у меня есть Id,

Теперь есть еще один столбец Document_IDs, который имеет id's, поэтому я хочу проверить погоду11 идентификатор документа присутствует в этом столбце Document ID's, который является массивом, подобным мудрому.

Так, например,

Окончательный вывод будет выглядеть так:

 did   avg  present    
   11   0.6    2
   13   0.9    1

2 - это 2 раза идентификатор документа 11, присутствующий в этом Document Id's column.

Я совершенно новичок в этом.Так что любая маленькая помощь будет отличной.

Ответы [ 5 ]

1 голос
/ 20 сентября 2019

Решение с использованием Counter и map

import collections
c = collections.Counter(df.Document_IDs.sum())    
df['Present'] = df.did.map(c)

df[['did', 'avg', 'Present']]

Out[584]:
   did  avg  Present
0  11   0.6  2
1  13   0.9  1
1 голос
/ 20 сентября 2019

Вы можете извлечь столбец Document_IDs с помощью DataFrame.pop, затем сгладить значения на chain.from_iterable, так что возможно sum согласованных значений в генераторе с apply:

import ast
from  itertools import chain

df['Document_IDs'] = df['Document_IDs'].fillna('[]').apply(ast.literal_eval)

s = list(chain.from_iterable(df.pop('Document_IDs')))

df['pres'] = df['did'].map(lambda x: sum(y == x for y in s))
print (df)
   PredictedFeature  did  avg  pres
0            2000.0   11  0.6     2
1            2664.0   13  0.9     1

Или:

import ast
from itertools import chain
from collections import Counter

df['Document_IDs'] = df['Document_IDs'].fillna('[]').apply(ast.literal_eval)

df['pres'] = df['did'].map(Counter(chain.from_iterable(df.pop('Document_IDs'))))
print (df)
   PredictedFeature  did  avg  pres
0            2000.0   11  0.6     2
1            2664.0   13  0.9     1

РЕДАКТИРОВАТЬ:

from ast import literal_eval

def literal_eval_cust(x):
    try:
        return literal_eval(x)
    except Exception:
        return []


df['Document_IDs'] = df['Document_IDs'].apply(literal_eval_cust)
0 голосов
/ 20 сентября 2019

С учетом следующего ввода:

df = pd.DataFrame([[[3,4,5,6,3,3,5,4], 3], [[1,4,7,8,4,5,1], 4]], columns=['Document_IDs','did'])

В одной строке:

df['Present'] = df.apply(lambda row: row.Document_IDs.count(row.did), axis=1)

Если вы хотите напечатать интересующие вас результаты:

print(df[['did', 'avg', 'Present']])

   did  avg  Present
0    3  0.6        3
1    4  0.8        2
0 голосов
/ 20 сентября 2019

Вы также можете считать экземпляры элемента в списке.

Например, mylist.count(item)

Поэтому я бы создал функцию для применения этого к строкам:

def get_id(row):

    res = x['Document_IDs'].count(x['did'])

    return res

Затем примените его, создав новый столбец result.

df['result'] = df.apply(get_id,axis=1)

Хотя я уверен, что кто-нибудь придет с более быстрой версией:)

0 голосов
/ 20 сентября 2019

Если вы хотите использовать собственное решение для панд, попробуйте следующее:

df['pres'] = df.apply(lambda x: list(x['Document_IDs']).count(x['did']), axis=1)

Я не проверял скорость вычислений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...