pandas 表达式中带有格式修饰符的 F 字符串在 Series.__format__ 中触发 TypeError
F-string with format modifiers in pandas expression triggers TypeError in Series.__format__
当我在使用 pandas Series
的表达式中使用带格式修饰符的 f 字符串时 - 我得到 TypeError
。但是,相同的字符串表达式适用于常规数据。完全可以在 pandas 中执行此操作吗?
适用于常规数据:
episode = 42
frame = 4242
f"e{episode:03}_f{frame:06}.jpg"
> 'e042_f004242.jpg'
失败 pandas.Series
:
df['filename'] = f"e{df.episode:03}_f{df.frame:05}_i{df.item:05}.jpg"
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-84-73001803277d> in <module>
----> 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__
当我在 f 字符串中传递格式修饰符时显示 TypeError。任何类型,包括 {df.area:.2f}
。但是,如果没有格式修饰符,我不会收到任何错误,但会收到一些无用的东西,例如 e0 215\n1 1\n2 1\n3
我有变通办法,但我想使用 f 弦,因为它们很整洁。
pd.__version__
> '0.25.3'
df.info()
<class 'pandas.core.frame.DataFrame'>
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
不幸的是,如果传递 DataFrame 的列,f-string
将无法正常工作,这是 DataFrame.apply
with x['item']
because item
is valid pandas function Series.item
和 x.item
中的标量处理所必需的,此处引发错误:
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
或者在列表理解中:
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)]
However f-strings work fine with pd.Series without format modifiers: df['filename'] = f"e{df.episode}_f{df.frame}_i{df.item}.jpg" works OK.
我认为不是,因为系列,所以输出是:
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...
当我在使用 pandas Series
的表达式中使用带格式修饰符的 f 字符串时 - 我得到 TypeError
。但是,相同的字符串表达式适用于常规数据。完全可以在 pandas 中执行此操作吗?
适用于常规数据:
episode = 42
frame = 4242
f"e{episode:03}_f{frame:06}.jpg"
> 'e042_f004242.jpg'
失败 pandas.Series
:
df['filename'] = f"e{df.episode:03}_f{df.frame:05}_i{df.item:05}.jpg"
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-84-73001803277d> in <module>
----> 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__
当我在 f 字符串中传递格式修饰符时显示 TypeError。任何类型,包括 {df.area:.2f}
。但是,如果没有格式修饰符,我不会收到任何错误,但会收到一些无用的东西,例如 e0 215\n1 1\n2 1\n3
我有变通办法,但我想使用 f 弦,因为它们很整洁。
pd.__version__
> '0.25.3'
df.info()
<class 'pandas.core.frame.DataFrame'>
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
不幸的是,如果传递 DataFrame 的列,f-string
将无法正常工作,这是 DataFrame.apply
with x['item']
because item
is valid pandas function Series.item
和 x.item
中的标量处理所必需的,此处引发错误:
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
或者在列表理解中:
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)]
However f-strings work fine with pd.Series without format modifiers: df['filename'] = f"e{df.episode}_f{df.frame}_i{df.item}.jpg" works OK.
我认为不是,因为系列,所以输出是:
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...