Esto es en referencia al problema que planteé aquí: compara dos marcos de datos de pandas con columnas desiguales

También en referencia: Cómo implementar 'en' y ' no en 'para el marco de datos de Pandas

He creado dos marcos de datos de pandas:

DataFrame: palabras

                  0
0           limited
1         desirable
2           advices

DataFrame: mcDonaldWL

            Word       Negative   Positive  Uncertainty
9            abandon     2009        0           0
10         abandoned     2009        0           0
11        desirables        0        2009        0
12       abandonment     2009        0           0
13           advices     2009        0           0
14          abandons     2009        0           0

Mi objetivo aquí es comparar las palabras [0] con mcDonaldWL ['Word'] y si aparece el elemento i-ésimo, presentar los resultados.

Result 
              Word       Negative   Positive  Uncertainty
 11        desirables        0       2009        0
 13           advices     2009        0           0

Intenté usar set, intersection, merge, pero no puedo encontrar una solución. ¿Alguna idea?

No genera la respuesta requerida. Esto no es duplicado.

Si corro

words[~words.word.isin(mcDonaldWL)] 

Entiendo:

    word
0   limited
1   desirable
1
lpt 1 nov. 2017 a las 02:11

4 respuestas

La mejor respuesta

Supongamos que tienes:

>>> df1
         col1
0     limited
1  desirables
2     advices
>>> df2
           Word  Negative  Positive  Uncertainty
9       abandon      2009         0            0
10    abandoned      2009         0            0
11   desirables         0      2009            0
12  abandonment      2009         0            0
13      advices      2009         0            0
14     abandons      2009         0            0

Tenga en cuenta que le he dado a su primer marco de datos una etiqueta de columna adecuada. De todos modos, lo más simple es usar Word como un índice :

>>> df2.set_index('Word', inplace=True)
>>> df2
             Negative  Positive  Uncertainty
Word
abandon          2009         0            0
abandoned        2009         0            0
desirables          0      2009            0
abandonment      2009         0            0
advices          2009         0            0
abandons         2009         0            0

¡Entonces puedes usar indexación!

>>> df2.loc[df1.col1.values]
            Negative  Positive  Uncertainty
Word
limited          NaN       NaN          NaN
desirables       0.0    2009.0          0.0
advices       2009.0       0.0          0.0
>>> df2.loc[df1.col1.values].dropna()
            Negative  Positive  Uncertainty
Word
desirables       0.0    2009.0          0.0
advices       2009.0       0.0          0.0
>>>
1
juanpa.arrivillaga 31 oct. 2017 a las 23:22

Enfoque 1

ws = words.values.ravel().astype(str)
wl = mcDonaldWL.Word.values.astype(str)

mcDonaldWL[(np.core.defchararray.find(wl[:, None], ws) >= 0).any(1)]

          Word  Negative  Positive  Uncertainty
11  desirables         0      2009            0
13     advices      2009         0            0

Enfoque 2

mcDonaldWL[mcDonaldWL.Word.str.contains('|'.join(words.values.ravel()))]

          Word  Negative  Positive  Uncertainty
11  desirables         0      2009            0
13     advices      2009         0            0
1
piRSquared 31 oct. 2017 a las 23:48

Mediante el uso de partido difuso

from fuzzywuzzy import process
l=words.iloc[:,0].values.tolist()

a=[]
for x in mcDonaldWL.Word:
    if [process.extract(x, l, limit=1)][0][0][1]>=80:
        a.append([process.extract(x, l, limit=1)][0][0][0])
    else:
        a.append(np.nan)

mcDonaldWL['canfind']=a
mcDonaldWL.dropna().drop('canfind',1)


Out[494]: 
          Word  Negative  Positive  Uncertainty
11  desirables         0      2009            0
13     advices      2009         0            0
1
YOBEN_S 31 oct. 2017 a las 23:28

En words, tienes "deseable", pero en mcDonaldWL, tienes "deseables". Suponiendo que se supone que son iguales, puede hacer:

mcDonaldWL.set_index('Word', inplace=True)
mcDonaldWL.loc[words[0]]

Además, "consejos" no es una palabra.

0
Acccumulation 31 oct. 2017 a las 23:33