1
votes

Sous-chaînes de pandas

Comment extraire les 5ème et 6ème caractères de la chaîne d'une colonne en utilisant loc ou iloc et créer une nouvelle colonne?

Mon bloc de données:

print (df): p>

index effective date  pp
0     2019-12         12
2     2019-13         13
15    2019-10         10
20    2019-09         09
23    2018-26         26

Ce qui suit fonctionne mais il me donne la copie d'un message de tranche:

df['pp'] = df['effective date'].str[5:7]

Une valeur essaie d'être définie sur une copie d'une tranche d'un DataFrame. Essayez d'utiliser .loc [row_indexer, col_indexer] = value à la place

Consultez les mises en garde dans la documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy p >

Le résultat attendu est le suivant sans avertissement:

print (df):

index effective date
0     2019-12
2     2019-13
15    2019-10
20    2019-09
23    2018-26

J'ai parcouru la documentation recommandée mais je peux ' t trouver quelque chose qui fait vraiment le travail. Toute aide est appréciée.

-Dave


6 commentaires

Essayez df.loc [:, 'pp'] = df ['effective date']. Str [5: 7]


Je n'obtiens aucune erreur lorsque j'exécute le code comme vous l'avez


ne pouvez-vous pas simplement diviser les données par «-»?


@pissall, a essayé votre suggestion et cela me donne le message d'erreur deux fois.


@ SH-SF Je me demande maintenant si cela a à voir avec ma version. J'utilise 3.6.5. L'erreur est renvoyée dans le bloc-notes ipython.


@Dave Premièrement, ce n'est pas une erreur. C'est un avertissement que vous pouvez choisir d'ignorer. Essayez df.loc ["pp"] = df ['effective date']. Apply (lambda x: x.split ("-") [- 1])


4 Réponses :


0
votes

lors de l'utilisation de df ['pp'] = df ['effective date']. str [5: 7], je ne reçois aucun avertissement peut être votre besoin de mettre à jour votre versio python. en utilisant le package datetime, vous pouvez créer une nouvelle colonne comme jour

df ['effective date'] = pd.to_datetime (df.effective date, format = '% Y-% d') pour i in (df):

i['day']= i.effective date.dt.day
i['year']=i.effective date.dt.hour

df.head ()

cela devrait être un processus long mais pendant que nous prétraitons les valeurs de date, cela donnera des résultats précis


0 commentaires

1
votes

Peut-être essayer d'utiliser la fonction slice?

df['pp'] = df['effective date'].str.slice(5,7)

De plus, j'ai essayé votre méthode et je n'ai pas reçu d'avertissement.


0 commentaires

2
votes

Il semble que vous ayez juste besoin de str.split("-")

  effective date  pp
0        2019-12  12
1        2019-13  13
2        2019-10  10
3        2019-09  09
4        2018-26  26

ou

df['pp'] = pd.to_datetime(df['effective date'], format="%Y-%d").dt.day

df = pd.DataFrame({"effective date": ["2019-12", "2019-13", "2019-10", "2019-09", "2018-26"]})
df['pp'] = df['effective date'].str.split("-").str[1]
print(df)


0 commentaires

0
votes

Si vous souhaitez obtenir une partie des données après '-', mieux vaut utiliser la fonction de fractionnement

df['pp'] = df['effective date'].str.split('-').str[0]

Pour les données antérieures à '-'

df['pp'] = df['effective date'].str.split('-').str[1]

p>


0 commentaires