166 votes

Conversion d'une colonne dans un cadre de données pandas, de l'int à la chaîne.

J'ai un cadre de données dans pandas avec des colonnes de données mixtes (int et str). Je veux d'abord concaténer les colonnes dans le cadre de données. Pour ce faire, je dois convertir un fichier int colonne à str . J'ai essayé de faire comme suit :

mtrx['X.3'] = mtrx.to_string(columns = ['X.3'])

o

mtrx['X.3'] = mtrx['X.3'].astype(str)

mais dans les deux cas, cela ne fonctionne pas et je reçois une erreur disant "cannot concatenate 'str' and 'int' objects". Concaténation de deux str Les colonnes fonctionnent parfaitement bien.

8voto

SophiaLune Points 21

Je me rends compte que c'est une vieille question, mais comme c'est la première chose qui arrive pour la conversion des chaînes df, je pense qu'elle doit être à jour.

Si vous voulez que le dtype réel soit une chaîne de caractères (plutôt qu'un objet) et/ou si vous devez gérer la conversion de date dans votre df et/ou si vous avez NaN/None dans votre df. Aucun des éléments ci-dessus ne fonctionnera .

que vous devriez utiliser :

df.astype('string')

Vous pouvez comparer les résultats sur ce df :

import pandas as pd
import numpy as np
from datetime import datetime

# Example dataframe
min_index = datetime(2050, 5, 2, 0, 0, 0)
max_index = datetime(2050, 5, 3, 23, 59, 0)
df = pd.DataFrame(data=pd.date_range(start=min_index, end=max_index, freq = "H"), columns=["datetime"])
df["hours"] = df["datetime"].dt.hour
df["day_name"] = df["datetime"].dt.strftime("%A")
df["numeric_cat"] = [np.random.choice([0,1,2]) for a in range(df.shape[0])]

# Add missing values:
df = df.mask(np.random.random(df.shape) < 0.1)

# str 
df1 = df.astype(str) #same pb with apply(str)
df1.isnull().sum().sum() # return 0 which is wrong
df1.info() #gives you a dtype object 

# string
df2 = df.astype('string')
df2.isnull().sum().sum() # return the correct nb of missing value
df2.info() #gives you a dtype string

0voto

sujithramanathan Points 209

Juste pour une référence supplémentaire.

Toutes les réponses ci-dessus fonctionnent dans le cas d'un cadre de données. Mais si vous utilisez lambda lors de la création/modification d'une colonne, les réponses ci-dessus ne fonctionneront pas, car dans ce cas, l'attribut est considéré comme un attribut int au lieu d'une série pandas. Vous devez utiliser str( target_attribute ) pour en faire une chaîne. Veuillez vous référer à l'exemple ci-dessous.

def add_zero_in_prefix(df):
    if(df['Hour']<10):
        return '0' + str(df['Hour'])

data['str_hr'] = data.apply(add_zero_in_prefix, axis=1)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X