web-dev-qa-db-fra.com

pandas sélectionnez dans Dataframe en utilisant startswith

Cela fonctionne (en utilisant Pandas 12 dev)

table2=table[table['SUBDIVISION'] =='INVERNESS']

Ensuite, j'ai réalisé que je devais sélectionner le champ en utilisant "commence par" Puisqu'il me manquait un groupe. Donc, selon le document Pandas aussi proche que possible, j'ai essayé

criteria = table['SUBDIVISION'].map(lambda x: x.startswith('INVERNESS'))
table2 = table[criteria]

Et obtenu AttributeError: l'objet 'float' n'a pas d'attribut 'commence par'

J'ai donc essayé une syntaxe alternative avec le même résultat

table[[x.startswith('INVERNESS') for x in table['SUBDIVISION']]]

Référence http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing Section 4: La compréhension des listes et la méthode de cartographie des séries peuvent également être utilisées pour produire des critères plus complexes :

Qu'est-ce que je rate?

38
dartdog

Vous pouvez utiliser le str.startswith Méthode DataFrame pour donner des résultats plus cohérents:

In [11]: s = pd.Series(['a', 'ab', 'c', 11, np.nan])

In [12]: s
Out[12]:
0      a
1     ab
2      c
3     11
4    NaN
dtype: object

In [13]: s.str.startswith('a', na=False)
Out[13]:
0     True
1     True
2    False
3    False
4    False
dtype: bool

et l'indexation booléenne fonctionnera très bien (je préfère utiliser loc, mais cela fonctionne tout de même sans):

In [14]: s.loc[s.str.startswith('a', na=False)]
Out[14]:
0     a
1    ab
dtype: object

.

Il semble qu'au moins l'un de vos éléments dans la série/colonne soit un flottant, qui n'a pas de méthode de démarrage avec donc l'attributError, la compréhension de la liste devrait générer la même erreur ...

50
Andy Hayden

Pour récupérer toutes les lignes qui startwith chaîne obligatoire

dataFrameOut = dataFrame[dataFrame['column name'].str.match('string')]

Pour récupérer toutes les lignes qui contient chaîne obligatoire

dataFrameOut = dataFrame[dataFrame['column name'].str.contains('string')]
3
Vinoj John Hosan

Vous pouvez utiliser apply pour appliquer facilement n'importe quelle fonction de correspondance de chaîne à votre colonne élément par élément.

table2=table[table['SUBDIVISION'].apply(lambda x: x.startswith('INVERNESS')]

ceci en supposant que votre colonne "SUBDIVISION" est du type correct (chaîne)

2
AleAve81