J'ai un bloc de données avec une colonne et je voudrais le diviser en deux colonnes, avec un en-tête de colonne comme ' fips'
et l'autre'row'
Mon dataframe df
ressemble à ceci:
row
0 00000 UNITED STATES
1 01000 ALABAMA
2 01001 Autauga County, AL
3 01003 Baldwin County, AL
4 01005 Barbour County, AL
Je ne sais pas comment utiliser df.row.str[:]
pour atteindre mon objectif de division de la cellule de ligne. Je peux utiliser df['fips'] = hello
pour ajouter une nouvelle colonne et la remplir avec hello
. Des idées?
fips row
0 00000 UNITED STATES
1 01000 ALABAMA
2 01001 Autauga County, AL
3 01003 Baldwin County, AL
4 01005 Barbour County, AL
read_table()
orread_fwf()
Réponses:
Il pourrait y avoir une meilleure façon, mais voici une approche:
la source
index = df.index
et vous êtes bon.split
méthode retourne NaN et latolist
méthode renverra cette valeur telle quelle (NaN), ce qui entraîneraValueError
(pour résoudre ce problème, vous pouvez le convertir en type chaîne avant de fractionner). Je vous recommande de l'essayer par vous-même, c'est la meilleure façon d'apprendre :-)df
a l'enrow
-tête de colonne? Vous pouvez penser que c'est une sorte d'attribut DataFrame mais il est assez clair que c'est le nom de la colonne. C'est à vous de voir comment vous créez et définissez vos en-têtes de colonne, donc si vous en utilisez un autre, utilisez-le (par exempledf.my_column_name.split(...)
).Version TL; DR:
Pour le cas simple de:
La solution la plus simple est:
Ou vous pouvez créer créer un DataFrame avec une colonne pour chaque entrée de la division automatiquement avec:
Vous devez utiliser
expand=True
si vos chaînes ont un nombre non uniforme de fractionnements et que vous souhaitezNone
remplacer les valeurs manquantes.Remarquez comment, dans les deux cas, la
.tolist()
méthode n'est pas nécessaire. Ni l'un ni l'autrezip()
.En détail:
La solution d'Andy Hayden est la plus excellente pour démontrer la puissance de la
str.extract()
méthode.Mais pour un simple fractionnement sur un séparateur connu (comme le fractionnement par des tirets ou le fractionnement par des espaces), la
.str.split()
méthode est suffisante 1 . Il fonctionne sur une colonne (série) de chaînes et renvoie une colonne (série) de listes:1: Si vous n'êtes pas sûr de ce que font les deux premiers paramètres
.str.split()
, je recommande les documents pour la version Python standard de la méthode .Mais comment allez-vous:
à:
Eh bien, nous devons examiner de plus près l'
.str
attribut d'une colonne.C'est un objet magique qui est utilisé pour collecter des méthodes qui traitent chaque élément d'une colonne comme une chaîne, puis appliquent la méthode respective dans chaque élément aussi efficacement que possible:
Mais il a aussi une interface "d'indexation" pour récupérer chaque élément d'une chaîne par son index:
Bien sûr, cette interface d'indexation de
.str
ne se soucie pas vraiment si chaque élément qu'il indexe est en fait une chaîne, tant qu'il peut être indexé, donc:Ensuite, c'est une simple question de tirer parti du déballage du tuple Python des itérables pour faire
Bien sûr, extraire un DataFrame du fractionnement d'une colonne de chaînes est si utile que la
.str.split()
méthode peut le faire pour vous avec leexpand=True
paramètre:Donc, une autre façon d'accomplir ce que nous voulions est de faire:
La
expand=True
version, bien que plus longue, présente un net avantage sur la méthode de décompression de tuple. Le déballage de tuple ne gère pas bien les divisions de différentes longueurs:Mais le
expand=True
gère bien en plaçantNone
dans les colonnes pour lesquelles il n'y a pas assez de "divisions":la source
.split()
méthode qui explique mieux les deux premiers paramètres que les documents Pandas.df.join(df['AB'].str.split('-', 1, expand=True).rename(columns={0:'A', 1:'B'}))
Vous pouvez extraire les différentes parties de manière assez nette en utilisant un modèle d'expression régulière:
Pour expliquer le regex quelque peu long:
\d
) et les nomme"fips"
.La partie suivante:
Soit (
|
) l'une des deux choses suivantes:*
) de majuscules ou d'espaces ([A-Z ]
) et le nomme"state"
avant la fin de la chaîne ($
),ou
.*
) puisstate_code
avant la fin de la chaîne ($
).Dans l'exemple:
Notez que les deux premières lignes atteignent "l'état" (en laissant NaN dans les colonnes comté et état_code), tandis que les trois dernières frappent le comté, état_code (en laissant NaN dans la colonne état).
la source
(?P<label>...)
syntaxe! Je ne sais pas pourquoi je suis allé pour le regex plus complexe, clairement le simple pourrait fonctionner hmmmm<group_name>
. Maintenant je le sais, cela rend mon code très succinct.la source
Si vous ne souhaitez pas créer un nouveau cadre de données, ou si votre cadre de données comporte plus de colonnes que celles que vous souhaitez fractionner, vous pouvez:
la source
zip argument #1 must support iteration
erreur, python 2.7Vous pouvez utiliser
str.split
par espace (séparateur par défaut) et paramètreexpand=True
pourDataFrame
avec assigner à de nouvelles colonnes:Modification si besoin supprimer la colonne d'origine avec
DataFrame.pop
Qu'est-ce que c'est comme:
Si obtenir une erreur:
Vous pouvez vérifier et retourner 4 colonnes
DataFrame
, pas seulement 2:Ensuite, la solution est ajoutée
DataFrame
parjoin
:Avec supprimer la colonne d'origine (s'il existe également une autre colonne):
la source
Si vous souhaitez diviser une chaîne en plus de deux colonnes sur la base d'un délimiteur, vous pouvez omettre le paramètre «divisions maximales».
Vous pouvez utiliser:
Cela créera automatiquement autant de colonnes que le nombre maximal de champs inclus dans l'une de vos chaînes initiales.
la source
Surpris, je n'ai pas encore vu celui-ci. Si vous n'avez besoin que de deux scissions, je le recommande vivement. . .
Series.str.partition
partition
effectue une séparation sur le séparateur et est généralement assez performant.Si vous devez renommer les lignes,
Si vous devez le joindre à nouveau à l'original, utilisez
join
ouconcat
:la source
Je préfère exporter les séries de pandas correspondant ( à savoir les colonnes dont j'ai besoin), en utilisant l' appliquer fonction pour diviser le contenu de la colonne en plusieurs séries, puis rejoindre les colonnes générées à la trame de données existante. Bien sûr, la colonne source doit être supprimée.
par exemple
Pour diviser deux mots, la fonction des chaînes devrait ressembler à ceci:
la source
J'ai vu que personne n'avait utilisé la méthode de la tranche, alors ici j'ai mis mes 2 cents ici.
Cette méthode créera deux nouvelles colonnes.
la source
Utilisez
df.assign
pour créer un nouveau df. Voir http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copyla source