我有以下df:
df = pd.DataFrame({'A': [0.0137, 0.1987, 'Decimal('NaN')', 0.7653]})
輸出:
A
0 0.0137
1 0.1987
2 NaN
3 0.7653
我正在嘗試A使用.iloc(因為我的實際代碼中有很多列)將每一行從 column 格式化為例如 1.37%。
但是,如果我執行
df.iloc[:, 0] = (df.iloc[:, 0] * 100).astype(float).map('{:,.2f}%'.format)
所有的 NaN 行都收到一個尾隨'%',產生'NaN%'
所以如果我嘗試:
df.iloc[:, 0] = df.iloc[:, 0].apply(
lambda x: (x * 100).astype(float).map('{:,.2f}%'.format) if not istinstance(x, Decimal)
else None)
我明白了IndexError: single positional indexer is out-of-bounds。
如何正確格式化我的每一行df不是 a Decimal(NaN)?
注意:我專門在等號之前使用 df.iloc ,因為我只想就地更改這些列。
uj5u.com熱心網友回復:
使用 df.loc 選擇不 NA 行并應用您已經構建的邏輯
# your DF definition has 'NaN' as string, to converting it to np.nan
df.replace('NaN', np.nan, inplace=True)
# Select rows where the value for A is notna() and
# apply formatting
df.loc[df['A'].notna(), 'A']=(df.iloc[:, 0] * 100).astype(float).map('{:,.2f}%'.format)
df
A
0 1.37%
1 19.87%
2 NaN
3 76.53%
uj5u.com熱心網友回復:
嘗試這個:
df.loc[~df['A'].isna(), 'A'] = (df.loc[~df['A'].isna(), 'A'] * 100).apply('{:,.2f}%'.format)
但請注意,您將NaNvalue 用作字串。我建議使用 numpy 值。這應該是:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [0.0137, 0.1987, np.nan, 0.7653]})
df.loc[~df['A'].isna(), 'A'] = (df.loc[~df['A'].isna(), 'A'] * 100).apply('{:,.2f}%'.format)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/518236.html
上一篇:Pandas,多串列
