3 votes

Les modificateurs de format avec les chaînes F dans l'expression pandas déclenchent une TypeError dans Series.__format__

Lorsque j'utilise une f-string avec des modificateurs de format dans une expression utilisant pandas Series - je reçois une TypeError. Cependant, la même expression de chaîne fonctionne bien avec des données régulières. Est-il possible de le faire en pandas?

Fonctionne avec des données régulières:

episode = 42
frame = 4242
f"e{episode:03}_f{frame:06}.jpg"
> 'e042_f004242.jpg'

Échoue avec pandas.Series:

df['filename'] = f"e{df.episode:03}_f{df.frame:05}_i{df.item:05}.jpg"
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in 
----> 1 df['filename'] = f"e{df.episode:03}_f{df.frame:05}_i{df.item:05}.jpg"
TypeError: unsupported format string passed to Series.__format__

Le TypeError apparaît lorsque je passe des modificateurs de format dans une f-string. De n'importe quel type, y compris {df.area:.2f}. Cependant, sans modificateurs de format, je n'ai pas d'erreur mais je reçois quelque chose d'inutile comme e0 215\n1 1\n2 1\n3

J'ai des contournements, mais j'aimerais utiliser les f-strings car elles sont propres.

pd.__version__
> '0.25.3'

df.info()

RangeIndex: 84604 entries, 0 to 84603
Data columns (total 5 columns):
episode     84604 non-null int32
frame       84604 non-null int64
item        84604 non-null int64
img_size    84604 non-null float64
bounds      84604 non-null object
dtypes: float64(1), int32(1), int64(2), object(1)
memory usage: 2.9+ MB

2voto

jezrael Points 290608

Malheureusement f-chaîne ne fonctionne pas si vous passez des colonnes de DataFrame, il est nécessaire de traiter par des scalaires dans DataFrame.apply avec x['item'] parce que item est une fonction pandas valide Series.item et x.item soulève une erreur ici :

df = pd.DataFrame({'episode':[42, 21], 'frame':[4242,4248], 'item':[20,563]})

df['filename']=df.apply(lambda x: f"e{x.episode:03}_f{x.frame:05}_i{x['item']:05}.jpg", axis=1)
print (df)
   episode  frame  item                filename
0       42   4242    20  e042_f04242_i00020.jpg
1       21   4248   563  e021_f04248_i00563.jpg

Ou en compréhension de liste :

df['filename'] = [f"e{e:03}_f{f:05}_i{i:05}.jpg" 
                  for e,f,i  
                  in zip(df.episode, df.frame, df.item)]

Cependant les f-chaînes fonctionnent bien avec pd.Series sans les modificateurs de format : df['filename'] = f"e{df.episode}_f{df.frame}_i{df.item}.jpg" fonctionne correctement.

Je ne pense pas, parce que Series, donc la sortie est :

df['filename'] = f"e{df.episode}_f{df.frame}_i{df.item}.jpg"
print (df)
   episode  frame  item                                           filename
0       42   4242    20  e0    42\n1    21\nName: episode, dtype: int64...
1       21   4248   563  e0    42\n1    21\nName: episode, dtype: int64...

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