1
votes

Comment puis-je obtenir l'intersection de deux colonnes de texte de la série pandas?

J'ai deux séries de colonnes de texte pandas, comment puis-je obtenir l'intersection de celles-ci?

df.apply(lambda x: x.intersection(df1))
TypeError: unhashable type: 'set'

Je recherche une sortie comme ci-dessous.

print(df2)

0  {this, is}
1  {good}


1 commentaires

J'ai essayé d'y répondre à ma manière en gardant vos points que vous avez mentionnés dans le problème. df et df2 sont des DataFrames, je suppose, basés sur des noms, mais les réponses sont en termes de séries. J'ai donc pensé à répondre à l'utilisation de DataFrame en utilisant également intersection () .


4 Réponses :


1
votes

Cette approche fonctionne pour moi

import pandas as pd
import numpy as np

data = np.array([{'this', 'is', 'good'},{'this', 'is', 'not', 'good'}])
data1 = np.array([{'this', 'is'},{'good', 'bad'}])
df = pd.Series(data)
df1 = pd.Series(data1)

df2 = pd.Series([df[i] & df1[i] for i in xrange(df.size)])
print(df2)


1 commentaires

Cela fonctionne très bien mais c'est lent sur mon énorme ensemble de données. Merci



1
votes

On dirait une logique simple:

s1 = pd.Series([{'this', 'is', 'good'}, {'this', 'is', 'not', 'good'}])
s2 = pd.Series([{'this', 'is'}, {'good', 'bad'}])
s1 - (s1 - s2)  
#Out[122]: 
#0    {this, is}
#1        {good}
#dtype: object


1 commentaires

Merci. Comment puis-je également faire une union avec l'approche ci-dessus?



0
votes

Similaire à ci-dessus, sauf si vous souhaitez tout conserver dans un même dataframe

Current df:
df = pd.DataFrame({0: np.array([{'this', 'is', 'good'},{'this', 'is', 'not', 'good'}]), 1: np.array([{'this', 'is'},{'good', 'bad'}])})

Intersection of series 0 & 1
df[2] = df.apply(lambda x: x[0] & x[1], axis=1)


0 commentaires

1
votes

J'apprécie les réponses ci-dessus. Voici un exemple simple pour résoudre la même chose si vous avez DataFrame (comme je suppose, après avoir examiné vos noms de variables comme df & df1 , vous l'aviez demandé pour DataFrame .).

Cette df.apply (lambda row: row [0] .intersection (df1.loc [row.name] [0]), axis = 1) le fera. Voyons comment j'ai trouvé la solution.

La réponse sur https: // stackoverflow.com/questions/266582 ... m'a été utile.

>>> df.apply(lambda x: print(x.name), axis=1)
0
1
0    None
1    None
dtype: object
>>> 
>>> df.loc[0]
set    {this, is, good}
Name: 0, dtype: object
>>> 
>>> df.apply(lambda row: print(row[0]), axis=1)
{'this', 'is', 'good'}
{'not', 'this', 'is', 'good'}
0    None
1    None
dtype: object
>>> 
>>> df.apply(lambda row: print(type(row[0])), axis=1)
<class 'set'>
<class 'set'>
0    None
1    None
dtype: object
>>> df.apply(lambda row: print(type(row[0]), df1.loc[row.name]), axis=1)
<class 'set'> set    {this, is}
Name: 0, dtype: object
<class 'set'> set    {good}
Name: 1, dtype: object
0    None
1    None
dtype: object
>>> df.apply(lambda row: print(type(row[0]), type(df1.loc[row.name])), axis=1)
<class 'set'> <class 'pandas.core.series.Series'>
<class 'set'> <class 'pandas.core.series.Series'>
0    None
1    None
dtype: object
>>> df.apply(lambda row: print(type(row[0]), type(df1.loc[row.name][0])), axis=1)
<class 'set'> <class 'set'>
<class 'set'> <class 'set'>
0    None
1    None
dtype: object
>>> 

Comment j'ai atteint la solution ci-dessus?

>>> import pandas as pd

>>> 
>>> df = pd.DataFrame({
...     "set": [{"this", "is", "good"}, {"this", "is", "not", "good"}]
... })
>>> 
>>> df
                     set
0       {this, is, good}
1  {not, this, is, good}
>>> 
>>> df1 = pd.DataFrame({
...     "set": [{"this", "is"}, {"good", "bad"}]
... })
>>> 
>>> df1
           set
0   {this, is}
1  {bad, good}
>>>
>>> df.apply(lambda row: row[0].intersection(df1.loc[row.name][0]), axis=1)
0    {this, is}
1        {good}
dtype: object
>>> 


0 commentaires