Disons que j'ai une trame de données pandas df

[In] df = pd.read_csv('data.csv')

En raison de la colonne vide, je laisse tomber les deux dernières colonnes de df

[In] csv_df.drop(csv_df.columns[-2:], axis = 1, inplace=True)
[In] print(type(csv_df[csv_df.columns[2:]]))

La structure de données de retour est

[Out] <class 'pandas.core.frame.DataFrame'>

Cependant, lorsque je manipule le contenu de tous les x par df.apply(), le type de retour est passé à la série pandas.

# replace comma
[In] csv_df = csv_df[csv_df.columns[2:]].apply(lambda x: str(x).replace(',','.'))
[In] print(type(csv_df))
[Out] <class 'pandas.core.series.Series'>

J'ai consulté le site officiel des pandas de apply(), il a dit qu'il peut renvoyer une série ou une trame de données.

Renvoie : appliqué : Series ou DataFrame

Ma question est

Comment puis-je conserver la structure de données pour qu'elle soit une trame de données pandas après df.apply() ?

Merci d'avance!

1
WY Hsu 18 mars 2019 à 09:28

2 réponses

Meilleure réponse

Vous pouvez utiliser l'opération fonctionnant avec DataFrame ici - DataFrame.astype pour convertir en strings et DataFrame.replace :

csv_df = csv_df[csv_df.columns[2:]].astype(str).replace(',','.')

Si vous avez besoin d'une solution avec appliquer, surtout si vous travaillez avec une fonction fonctionnant uniquement en série :

csv_df = csv_df[csv_df.columns[2:]].apply(lambda x: x.astype(str).str.replace(',','.'))

Fonction str.lower fonctionnant uniquement en Series :

csv_df = csv_df[csv_df.columns[2:]].apply(lambda x: x.astype(str).str.lower().str.replace(',','.'))
3
jezrael 18 mars 2019 à 06:33

Si cela peut vous aider, passez simplement result_type='expand'

df.apply(lambda x: [4, 7], axis=1, result_type='expand')
1
user69659 18 mars 2019 à 06:40