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}
4 Réponses :
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)
Cela fonctionne très bien mais c'est lent sur mon énorme ensemble de données. Merci
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
Merci. Comment puis-je également faire une union avec l'approche ci-dessus?
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)
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
>>>
>>> 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
>>>
J'ai essayé d'y répondre à ma manière en gardant vos points que vous avez mentionnés dans le problème.
dfetdf2sont 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 égalementintersection ().